【前端】JS求两个对象数组的差集

let arr1 = [

{fpcid: "2da37fdfe66140089dc3367b21cc6194", fpcNameCode: "34"},

{fpcid: "2da37fdfe66140089dc3367b21cc6195", fpcNameCode: "33"},

{fpcid: "2da37fdfe66140089dc3367b21cc6196", fpcNameCode: "35"},

{fpcid: "2da37fdfe66140089dc3367b21cc6197", fpcNameCode: "36"}

];

let arr2 = [

{fpcid: "2da37fdfe66140089dc3367b21cc6194", fpcNameCode: "34"},

{fpcid: "2da37fdfe66140089dc3367b21cc6195", fpcNameCode: "33"}

];

JS求两个对象数组的差集

[

{fpcid: "2da37fdfe66140089dc3367b21cc6196", fpcNameCode: "35"},

{fpcid: "2da37fdfe66140089dc3367b21cc6197", fpcNameCode: "36"}

]

回答

先上代码:

{

let arr1 = [

{ fpcid: "2da37fdfe66140089dc3367b21cc6194", fpcNameCode: "34" },

{ fpcid: "2da37fdfe66140089dc3367b21cc6195", fpcNameCode: "33" },

{ fpcid: "2da37fdfe66140089dc3367b21cc6196", fpcNameCode: "35" },

{ fpcid: "2da37fdfe66140089dc3367b21cc6197", fpcNameCode: "36" }

];

let arr2 = [

{ fpcid: "2da37fdfe66140089dc3367b21cc6194", fpcNameCode: "34" },

{ fpcid: "2da37fdfe66140089dc3367b21cc6195", fpcNameCode: "33" }

];

function getDifferenceSetA(arr1, arr2) {

arr1 = arr1.map(JSON.stringify);

arr2 = arr2.map(JSON.stringify);

return arr1.concat(arr2).filter(function (v, i, arr) {

return arr.indexOf(v) === arr.lastIndexOf(v);

}).map(JSON.parse)

}

function getDifferenceSetB(arr1,arr2,typeName){

return Object.values(arr1.concat(arr2).reduce((acc,cur) => {

if (acc[cur[typeName]] && acc[cur[typeName]][typeName] === cur[typeName]) {

delete acc[cur[typeName]];

}else{

acc[cur[typeName]] = cur;

}

return acc ;

},{}));

}

console.log('getDifferenceSetA:',getDifferenceSetA(arr1,arr2));

console.log('getDifferenceSetB:',getDifferenceSetB(arr1,arr2,'fpcid'));

}

输出结果如下图:
【前端】JS求两个对象数组的差集

两种方案比较,A方案比较取巧,使用起来方便快捷,但有个问题,对于值不为基础类型的对象可能产生一些不可预知的报错;
B方案比较稳定,可以适应各种对象比较,但写法和逻辑相对A稍微复杂点。

这个可以将数组项转成字符串来处理,以下为代码:

console.log(((a = arr1.map(JSON.stringify),b = arr2.map(JSON.stringify))=>{ return a.concat(b).filter(c => !a.includes(c) || !b.includes(c)).map(JSON.parse)})())

//可拆分成,arr1和arr2为你提供的数据数组

function diffrence(a,b){

a = a.map(JSON.stringify);

b = b.map(JSON.stringify);

return a.concat(b).filter(v => !a.includes(v) || !b.includes(v)).map(JSON.parse)

}

diffrence(arr1,arr2);

let arr1 = [

{fpcid: "2da37fdfe66140089dc3367b21cc6194", fpcNameCode: "34"},

{fpcid: "2da37fdfe66140089dc3367b21cc6195", fpcNameCode: "33"},

{fpcid: "2da37fdfe66140089dc3367b21cc6196", fpcNameCode: "35"},

{fpcid: "2da37fdfe66140089dc3367b21cc6197", fpcNameCode: "36"}

];

let arr2 = [

{fpcid: "2da37fdfe66140089dc3367b21cc6194", fpcNameCode: "34"},

{fpcid: "2da37fdfe66140089dc3367b21cc6195", fpcNameCode: "33"}

];

解决方法:

function getDiffCollection(arr1, arr2) {

if(!Array.isArray(arr1) || !Array.isArray(arr2)) return null;

const longArr = arr1.length > arr2.length ? arr1 : arr2;

const diffCollect = longArr.reduce((acc, cv, index, arr) => {

if(!arr1[index] || !arr2[index]) acc.push(cv)

if(arr1[index] && arr2[index] && !equalObject(arr1[index], arr2[index])) acc.push(cv)

return acc

}, [])

return diffCollect;

}

function equalObject(o1, o2) {

for(const attr in o1) {

if(o1.hasOwnProperty(attr)) {

if(o1[attr] !== o2[attr]) return false

}

}

return true

}

【前端】JS求两个对象数组的差集

可能有些麻烦。有简单方法不舍赐教

对于这种值为基础类型的对象,可以试一下JSON.stringify(),转换成JSON字符串处理更方便点

这样试试。。。

【前端】JS求两个对象数组的差集

let arr1 = [

{ fpcid: "2da37fdfe66140089dc3367b21cc6194", fpcNameCode: "34" },

{ fpcid: "2da37fdfe66140089dc3367b21cc6195", fpcNameCode: "33" },

{ fpcid: "2da37fdfe66140089dc3367b21cc6196", fpcNameCode: "35" },

{ fpcid: "2da37fdfe66140089dc3367b21cc6197", fpcNameCode: "36" }

];

let arr2 = [

{ fpcid: "2da37fdfe66140089dc3367b21cc6194", fpcNameCode: "34" },

{ fpcid: "2da37fdfe66140089dc3367b21cc6195", fpcNameCode: "33" }

];

function diffset(arr1, arr2) {

var l, shortArr, longArr;

if (arr1.length > arr2.length) {

shortArr = arr2;

longArr = JSON.parse(JSON.stringify(arr1));

} else {

shortArr = arr1;

longArr = JSON.parse(JSON.stringify(arr2));

}

l = shortArr.length;

for (var i = l - 1; i >= 0; i--) {

let { fpcid, fpcNameCode } = shortArr[i]

let t = longArr.findIndex(item => item.fpcid === fpcid && item.fpcNameCode === fpcNameCode)

if (t < 0) {

longArr.push(arr2[i])

} else {

longArr.splice(t, 1)

}

}

return longArr;

}

console.table(diffset(arr1, arr2))

以上是 【前端】JS求两个对象数组的差集 的全部内容, 来源链接: utcz.com/a/78474.html

回到顶部