合并 2 个具有相同键的对象,来自 2 个数组的值

Posted

技术标签:

【中文标题】合并 2 个具有相同键的对象,来自 2 个数组的值【英文标题】:Merge 2 object with same key, value from 2 array 【发布时间】:2018-03-04 17:41:48 【问题描述】:

我想,如下所示:

var arr1 = [
     a: "a", 1: 1, 2: 2 ,
     a: "b", 1: 1, 2: 3 
];

var arr2 = [
     a: "a", 3: 123 ,
     a: "b", 3: 4411 
];

var arr3 = _.map(arr1, function(a1) 
    var a3 = ;

    _.map(arr2, function(a2) 
        if (a1.a == a2.a) 
            a3 = _.extend(a1, a2);
        
    )

    return a3
);

结果:

arr3 = [ 
   '1': 1, '2': 2, '3': 123, a: 'a' ,
   '1': 1, '2': 3, '3': 4411, a: 'b'  
]

它看起来很愚蠢吗?还有其他方法可以做到这一点吗? 感谢阅读。

【问题讨论】:

您的解决方案是否有效?问题是什么? 它起作用了,但我认为还有一些其他更好的方法可以通过一些库来做到这一点。 (我还没有用大数组长度测试过) 发布问题时请更具体。例如,提及您使用的是哪个 javascript 库。它将帮助人们调查您使用的类似图书馆。 同一个键是什么意思?相同的索引或相同的键a? How to use Lodash to merge two collections based on a key?的可能重复 【参考方案1】:

你可以的

var arr1 = [
     a: "a", 1: 1, 2: 2 ,
     a: "b", 1: 1, 2: 3 
];

var arr2 = [
     a: "a", 3: 123 ,
     a: "b", 3: 4411 
];

let result = arr1.map((e) => 
    for(let element of arr2)
        if(e.a == element.a) Object.assign(e, element);
    
    return e;
);
console.log(result);

【讨论】:

【参考方案2】:

使用 lodash 链将 concat 数组、group 类似对象,然后将 merge 每个组指向单个对象:

var arr1 = [ a: "a", 1: 1, 2: 2 ,  a: "b", 1: 1, 2: 3 ];
var arr2 = [ a: "a", 3: 123 ,  a: "b", 3: 4411 ];

var result = _(arr1)
  .concat(arr2) // concat the 2nd array
  .groupBy('a') // group by the identical key
  .map(_.spread(_.curry(_.merge, ))) // left currey merge to to create a new empty object, and spread the group as parameters
  .value();
  
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

在 ES6 中,您可以使用 Array#reduce 将相似对象收集到 Map 中,然后获取 Map#values 迭代器,并使用 spread syntax 转换为数组:

const arr1 = [ a: "a", 1: 1, 2: 2 ,  a: "b", 1: 1, 2: 3 ];
const arr2 = [ a: "a", 3: 123 ,  a: "b", 3: 4411 ];

const result = [...arr1.concat(arr2) // concat the arrays
  .reduce((m, o) => m.set(o.a, Object.assign(m.get(o.a) || , o)), // use a map to collect similar objects
  new Map()
).values()]; // get the values iterator of the map, and spread into a new array
  
console.log(result);

【讨论】:

Lodash 方式有效。但是 ES6 版本不工作。 @Ajinkya - 你试过运行 sn-ps 吗?如果是这样,您使用的是什么浏览器? 我的错。我没有替换 es6 sn-p 的属性“a”。两个 sn-ps 都在工作。考虑到性能,您建议使用哪一种? @Ajinkya - 我真的不知道要告诉你真相。如果物品的数量很少,那并不重要。如果金额很大,你应该使用 lodash,因为传播不是堆栈安全的。您需要对其进行概要分析。

以上是关于合并 2 个具有相同键的对象,来自 2 个数组的值的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法合并两个具有相同键的 JS 对象? [复制]

合并两个地图并对相同键的值求和的最佳方法?

将具有相同键的 JSON 对象合并在一起

如果第二个数组的项目包含数组的第一个对象的 id,则合并 Angular 8 中的两个对象数组

将字符串转换为具有重复键的对象到数组

java怎么将2个数组的数据合并?