javascript - 合并两个数组,在 redux 中使用不可变模式避免重复

标签 javascript ecmascript-6 redux lodash

假设我有两个数组:

let A = [a,b,c,d]
let B = [c,d,e]

其中每个字母都是一个具有多个属性的对象,其中一个是 id,它在我的域中是唯一的。合并的结果将是

[a,b,c,d,e]

其中 [c,d] 来自 B。

使用一种优雅的方法,我将如何以 B 中的任何元素覆盖 A 中的任何现有元素并且所有其他元素保持不变的方式合并这两个数组。所以它是一个联合,在发生冲突时优先使用 B 元素。

我有两个想法(使用 ES6 和 lodash):

//remove same elements first, then join arrays
let ids = new Set(B.map(e => e.id));
let newState = _.reject(A, constraint => ids.has(constraint.id));
return newState.concat(B);

//convert both to hashmap, join, then take values
let B_map = _.keyBy(B, 'id');
let A_map = _.keyBy(A, 'id');
return {...A_map, ...B_map}.values();

是否有更短/更简洁/更具可读性的版本?也许没有外部依赖?我本质上是在寻找类似

的东西

任何元素之间的相等性由 id 属性(或 v2 中的比较函数)定义。

最佳答案

没有外部依赖,你可以使用filterA 中提取在 B 中没有 id 的元素,并在 concat 中提取带有 B 的元素:

const A = [{id: 1, name: 'x'}, {id: 2, name: 'y'}, {id: 3, name: 'z'}];
const B = [{id: 2, name: 'hello'}];

let ids = new Set(B.map(e => e.id));
let newState = A.filter(a => !ids.has(a.id)).concat(B);

console.log(newState);

关于javascript - 合并两个数组,在 redux 中使用不可变模式避免重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53748134/

相关文章:

javascript - 与 requirejs 一起使用时会出现gapi未定义错误

javascript - 如何通过单击按钮每秒重新排列图像表?

javascript - 检查是否在 for/in 循环末尾

javascript - 在多个文件中需要库的正确方法

reactjs - Redux-persist迁移不迁移

javascript - 检查 PouchDB 数据库是否为空

javascript - 在下拉框中选择项目时如何在文本框中获取属性值?

javascript - 这是从带有对象的数组创建列表的正确方法吗?

redux - 为什么组件没有连接到 redux 商店?

reactjs - 路由更改时状态不会重置 - React-redux-router