javascript - 合并两个数组,在 redux 中使用不可变模式避免重复
问题描述
假设我有两个数组:
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 中的比较器函数)定义。
解决方案
如果没有外部依赖项,您可以使用filter
从A
没有 id 的元素B
和concat
带有id 的元素中提取元素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);
推荐阅读
- r - 由于 Latex 方程错误,无法将 RMarkdown 文档编织为 pdf
- here-api - 用于自动完成的 HERE API 6.2 与 7.0
- java - 如何在java中计算销售佣金
- python - 旋转相机小部件的正确方法是什么?
- osmnx - 由于包含“自然”和“土地使用”标签,osmnx 框被放大
- c++ - 如何找到并打印孪生素数?
- google-api - Google Insights API 在版本 5 中不返回 ruleImpact 分数。如何获得此分数?
- mysql-workbench - 当我尝试更改表以添加外键时,出现错误代码 1170
- python - 图像处理的多处理(已编辑)
- javascript - angularjs动态多选框带数量