如何在javascript中按ID合并多个对象数组
How to merge multiple array of object by ID in javascript?
我想将4个对象数组合并为一个数组
例如:4个类似的阵列
var arr1 =[
{ memberID : "81fs", RatingCW:4.5},
{ memberID : "80fs", RatingCW:4},
{ memberID : "82fs", RatingCW:5 },
{ memberID : "83fs", RatingCW:3},
{ memberID : "84fs", RatingCW:4.7}
];
var arr2 =[
{ memberID : "80fs", ratingWW: 4},
{ memberID : "81fs", ratingWW: 4.5},
{ memberID : "83fs", ratingWW: 3},
{ memberID : "82fs", ratingWW: 5},
{ memberID : "84fs", ratingWW: 3.5}
];
var arr3 = [
{ memberID : "80fs", incoCW:4},
{ memberID : "81fs", incoCW:4.5},
{ memberID : "82fs", incoCW:5},
{ memberID : "83fs", incoCW:3},
{ memberID : "84fs", incoCW:4.5}
];
var arr4 = [
{ memberID : "80fs", incoWW:3},
{ memberID : "81fs", incoWW:2.5 },
{ memberID : "82fs", incoWW:5 },
{ memberID : "83fs", incoWW:3 },
{ memberID : "84fs", incoWW:6.5 }
];
和预期类似阵列:
var finalArr = [
{ memberID : "80fs", RatingCW:4,ratingWW: 4, incoCW:4, incoWW:3},
{ memberID : "81fs", RatingCW:4.5,ratingWW: 4.5, incoCW:4.5, incoWW:2.5 },
{ memberID : "82fs", RatingCW:5,ratingWW: 5, incoCW:5, incoWW:5 },
{ memberID : "83fs", RatingCW:3,ratingWW: 3, incoCW:3, incoWW:3 },
{ memberID : "84fs", RatingCW:4.7,ratingWW: 3.5, incoCW:4.5, incoWW:6.5 }
];
使用lodash或普通javascript进行合并的最佳方式是什么?
有了lodash,我觉得可读性更强了。
var arr1 = [{"memberID":"81fs","RatingCW":4.5},{"memberID":"80fs","RatingCW":4},{"memberID":"82fs","RatingCW":5},{"memberID":"83fs","RatingCW":3},{"memberID":"84fs","RatingCW":4.7}],
arr2 = [{"memberID":"80fs","ratingWW":4},{"memberID":"81fs","ratingWW":4.5},{"memberID":"83fs","ratingWW":3},{"memberID":"82fs","ratingWW":5},{"memberID":"84fs","ratingWW":3.5}],
arr3 = [{"memberID":"80fs","incoCW":4},{"memberID":"81fs","incoCW":4.5},{"memberID":"82fs","incoCW":5},{"memberID":"83fs","incoCW":3},{"memberID":"84fs","incoCW":4.5}],
arr4 = [{"memberID":"80fs","incoWW":3},{"memberID":"81fs","incoWW":2.5},{"memberID":"82fs","incoWW":5},{"memberID":"83fs","incoWW":3},{"memberID":"84fs","incoWW":6.5}];
var merged = _(arr1)
.concat(arr2, arr3, arr4)
.groupBy("memberID")
.map(_.spread(_.merge))
.value();
console.log(merged);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
这是代码笔:http://codepen.io/kuhnroyal/pen/Wxzdmw
香草JS的方式,这是一个艰难的方式,花了几个小时才得到。
var arr1 = [{"memberID":"81fs","RatingCW":4.5},{"memberID":"80fs","RatingCW":4},{"memberID":"82fs","RatingCW":5},{"memberID":"83fs","RatingCW":3},{"memberID":"84fs","RatingCW":4.7}],
arr2 = [{"memberID":"80fs","ratingWW":4},{"memberID":"81fs","ratingWW":4.5},{"memberID":"83fs","ratingWW":3},{"memberID":"82fs","ratingWW":5},{"memberID":"84fs","ratingWW":3.5}],
arr3 = [{"memberID":"80fs","incoCW":4},{"memberID":"81fs","incoCW":4.5},{"memberID":"82fs","incoCW":5},{"memberID":"83fs","incoCW":3},{"memberID":"84fs","incoCW":4.5}],
arr4 = [{"memberID":"80fs","incoWW":3},{"memberID":"81fs","incoWW":2.5},{"memberID":"82fs","incoWW":5},{"memberID":"83fs","incoWW":3},{"memberID":"84fs","incoWW":6.5}];
const arrs=[].concat(arr1,arr2,arr3,arr4);
const noDuplicate=arr=>[...new Set(arr)]
const allIds=arrs.map(ele=>ele.memberID);
const ids=noDuplicate(allIds);
const result=ids.map(id=>
arrs.reduce((self,item)=>{
return item.memberID===id?
{...self,...item} : self
},{})
)
console.log(result);
以下是使用lodash:的一些步骤
- 将所有对象放入一个数组(_.flatform,然后_.groupby)
- 将2d数组展平为'user'obj的1d数组(_.map,然后_.merge并应用于作为arg传入数组)
var arr1 =[
{ memberID : "81fs", RatingCW:4.5},
{ memberID : "80fs", RatingCW:4},
{ memberID : "82fs", RatingCW:5 },
{ memberID : "83fs", RatingCW:3},
{ memberID : "84fs", RatingCW:4.7}
];
var arr2 =[
{ memberID : "80fs", ratingWW: 4},
{ memberID : "81fs", ratingWW: 4.5},
{ memberID : "83fs", ratingWW: 3},
{ memberID : "82fs", ratingWW: 5},
{ memberID : "84fs", ratingWW: 3.5}
];
var arr3 = [
{ memberID : "80fs", incoCW:4},
{ memberID : "81fs", incoCW:4.5},
{ memberID : "82fs", incoCW:5},
{ memberID : "83fs", incoCW:3},
{ memberID : "84fs", incoCW:4.5}
];
var arr4 = [
{ memberID : "80fs", incoWW:3},
{ memberID : "81fs", incoWW:2.5 },
{ memberID : "82fs", incoWW:5 },
{ memberID : "83fs", incoWW:3 },
{ memberID : "84fs", incoWW:6.5 }
];
var a = _.groupBy(_.flatten([arr1,arr2,arr3,arr4]), 'memberID');
var b = _.map(a, function(val){ return _.merge.apply(_,val) });
console.log(b);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.2.1/lodash.min.js"></script>
arr1.map(a =>
Object.assign({},a,
arr2.find(b => b.memberID === a.memberID),
arr3.find(c => c.memberID === a.memberID),
arr4.find(d => d.memberID === a.memberID)
)
)
这是最简单的代码。。。这基本上是一个oneliner解决方案。性能可能不是最好的,但对于小数据集来说效果很好。
您可以使用哈希表来正确引用结果数组。
由于对象中有引用memberID
,所以我也使用未排序的数组。
var arr1 = [{ memberID: "80fs", RatingCW: 4 }, { memberID: "81fs", RatingCW: 4.5 }, { memberID: "82fs", RatingCW: 5 }, { memberID: "83fs", RatingCW: 3 }, { memberID: "84fs", RatingCW: 4.7 }],
arr2 = [{ memberID: "80fs", ratingWW: 4 }, { memberID: "81fs", ratingWW: 4.5 }, { memberID: "82fs", ratingWW: 5 }, { memberID: "83fs", ratingWW: 3 }, { memberID: "84fs", ratingWW: 3.5 }],
arr3 = [{ memberID: "80fs", incoCW: 4 }, { memberID: "81fs", incoCW: 4.5 }, { memberID: "82fs", incoCW: 5 }, { memberID: "83fs", incoCW: 3 }, { memberID: "84fs", incoCW: 4.5 }],
arr4 = [{ memberID: "80fs", incoWW: 3 }, { memberID: "81fs", incoWW: 2.5 }, { memberID: "82fs", incoWW: 5 }, { memberID: "83fs", incoWW: 3 }, { memberID: "84fs", incoWW: 6.5 }],
merged = [];
[arr1, arr2, arr3, arr4].forEach(function (a) {
a.forEach(function (b) {
if (!this[b.memberID]) {
this[b.memberID] = {};
merged.push(this[b.memberID]);
}
Object.keys(b).forEach(function (k) {
this[b.memberID][k] = b[k];
}, this);
}, this);
}, Object.create(null));
console.log(merged);
ES6用于未排序的数据。
var arr1 = [{ memberID: "80fs", RatingCW: 4 }, { memberID: "81fs", RatingCW: 4.5 }, { memberID: "82fs", RatingCW: 5 }, { memberID: "83fs", RatingCW: 3 }, { memberID: "84fs", RatingCW: 4.7 }],
arr2 = [{ memberID: "80fs", ratingWW: 4 }, { memberID: "81fs", ratingWW: 4.5 }, { memberID: "82fs", ratingWW: 5 }, { memberID: "83fs", ratingWW: 3 }, { memberID: "84fs", ratingWW: 3.5 }],
arr3 = [{ memberID: "80fs", incoCW: 4 }, { memberID: "81fs", incoCW: 4.5 }, { memberID: "82fs", incoCW: 5 }, { memberID: "83fs", incoCW: 3 }, { memberID: "84fs", incoCW: 4.5 }],
arr4 = [{ memberID: "80fs", incoWW: 3 }, { memberID: "81fs", incoWW: 2.5 }, { memberID: "82fs", incoWW: 5 }, { memberID: "83fs", incoWW: 3 }, { memberID: "84fs", incoWW: 6.5 }],
merged = [];
[arr1, arr2, arr3, arr4].forEach((hash => a => a.forEach(b => {
if (!hash[b.memberID]) {
hash[b.memberID] = {};
merged.push(hash[b.memberID]);
}
Object.assign(hash[b.memberID], b);
}))(Object.create(null)));
console.log(merged);
相关文章:
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 在Javascript中转换对象数组
- 在JavaScript中通过索引从对象数组中获取值
- Backbone虹吸以获取对象数组
- 如何在DataTables 2.1中迭代对象数组
- Javascript-根据赋值顺序,按键合并对象数组
- 将事件附加到对象/数组
- jQuery$.inArray()总是返回-1和一个对象数组
- javascript处理一个对象数组以获得一个新的对象数组
- javascript在数组中获取对象数组中键的所有不同值
- 在对象数组中查找多个值的d3范围
- Undercore.js获取对象数组中键对象的值
- 在mongoose中使用正则表达式在对象数组中进行查询搜索
- 如何通过json对象数组为嵌套对象赋值
- 如何循环通过2个对象数组并通过匹配id进行合并
- 为对象数组创建列表项
- 如何使用javascript合并两个对象数组
- JSON到对象数组,并向每个对象添加项
- JavaScript:从对象数组中获取唯一值及其计数
- 按不同项目对对象数组进行排序