前言
对象数组常会进行取交集或者差集的操作。
假设有对象数组A和对象数组B,常规方法是比较B对象数组与A对象数组的差异,进而找到其差集或者交集。
但是现在面临的问题是数组A 和数组B中的对象可能不完全一样的情况,可采用以下方法解决该问题。
对象数组的定义
我们把对象数组A定义为长数组,其中包含的对象属性包括了name, age, weight等三个属性;对象数组B定义为短数组,这里是指其元素个数小于数组A,其对象属性包括了name, age等2个属性。
let wideArray = [{
name: "luojiarui", age: 18, weight: 78}, {
name: "zhangqirui", age: 28, weight: 70}];
let shortArray = [{
name: "zhangqirui", age: 28}];
如果我们进行取对象的交集,那么就首先需要将对象属性进行重新处理为一样的属性,再进行差异比较。
最终的差集是:
finalArray = [{
name: "luojiarui", age: 18, weight: 78}]
最终的交集是:
finalArray = [{
name: "zhangqirui", age: 28, weight: 70}]
找出对象中的特定的属性
对象中特定属性的查找可以采用遍历对象的方法,我们这里采用reduce。
首先我们看官方案例中计算,数组里所有值的和。这里采用累计器和当前值不断累积,最终计算出整个数组的和。注意在reduce的第二个参数中可以给出累加器的初始值,这里代码给出的是0。
var sum = [0, 1, 2, 3].reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 0);
// 和为 6
也可以写成箭头函数的形式:
var total = [ 0, 1, 2, 3 ].reduce(
( acc, cur ) => acc + cur,
0
);
这里,我封装了一个函数,名叫pick。其用途是找出对象中指定的属性,且属性是必须包含。
function pick(obj, arr) {
// 参考网络上关于对象属性查找的方法,但是其没有指定必须包含该属性。
// return arr.reduce((iter, val) => (val in obj && (iter[val] = obj[val]), iter), {});
// 如果你打算提供一个初始值作为reduce()方法的第二个参数
return arr.reduce((iter, val) => {
if(val in obj) {
iter[val]

本文介绍了如何处理对象数组的交集和差集问题,特别是当对象属性不完全相同时。通过重新整理对象属性,使用reduce方法查找特定属性,并利用JSON.stringify进行比较。此外,还提供了一个名为arrayFilter的函数,用于根据指定属性计算差集或交集。文章还包含了示例代码和实际应用。
最低0.47元/天 解锁文章
1356

被折叠的 条评论
为什么被折叠?



