在 JavaScript 中获取 2 个对象数组之间的差异
Getting difference between 2 arrays of objects in JavaScript
我在互联网上搜索了很多,我认为这将是一个非常简单的任务,但我还没有找到任何解决方案
这是我的两个对象数组
第一个数组
[
{ id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 },
{ id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 },
{ id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 },
{ id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 },
{ id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },
{ id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 },
{ id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 }
]
第二个数组
[
{ id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 },
{ id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 },
{ id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 }
]
我想得到两个对象数组之间的差异,我想要这样的结果
第一个数组 - 第二个数组 =(第一个数组中存在但第二个数组中不存在的对象数组)
[ { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 },
{ id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },
{ id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 },
{ id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ]
我试过很多很多方法像这样过滤
let c = existingBillPlans.filter(item =>
!billPlans.some(other => item.x == other.x));
但它给出的是空数组。无法理解我应该做什么。
你快到了,使用 id
而不是 x
existingBillPlans.filter(item => !billPlans.some(other => item.id == other.id));
演示
var existingBillPlans = [{
id: 2,
fees: 10000,
name: 'Yearly Plan',
cycle: 12
},
{
id: 3,
fees: 1500,
name: 'Two Months Plan',
cycle: 2
},
{
id: 4,
fees: 2500,
name: 'Three Months Plan',
cycle: 3
},
{
id: 5,
fees: 3000,
name: 'Four Months Plan',
cycle: 4
},
{
id: 181,
fees: 4000,
name: 'Five Months Plan',
cycle: 5
},
{
id: 182,
fees: 5000,
name: 'Six Months Plan',
cycle: 6
},
{
id: 183,
fees: 6000,
name: 'Seven Months Plan',
cycle: 7
}
]
var billPlans = [{
id: 2,
fees: 10000,
name: 'Yearly Plan',
cycle: 12
},
{
id: 3,
fees: 1500,
name: 'Two Months Plan',
cycle: 2
},
{
id: 4,
fees: 2500,
name: 'Three Months Plan',
cycle: 3
}
]
var output = existingBillPlans.filter(item => !billPlans.some(other => item.id == other.id));
console.log(output);
我想你想检查每个对象的 属性。
要检查对象的所有属性,请使用 every
方法。
let first_array = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 }, { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 }, { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 }, { id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 }, { id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ], second_array = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 } ]
let result = first_array
.filter(item => !second_array
.find(other => Object.keys(other)
.every(prop => item[prop] == other[prop]))
);
console.log(result);
您可以使用 .map()
创建一个 ids
的数组,然后应用 .filter()
let result = (
(array, ids) => array.filter(({ id }) => !ids.includes(id)))(a1, a2.map(({ id }) => id)
);
演示:
let a1 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 }, { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 }, { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },{ id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 },{ id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ];
let a2 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 } ];
let result = (
(array, ids) => array.filter(({ id }) => !ids.includes(id)))(a1, a2.map(({ id }) => id)
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
或者您可以像这样使用 filter()
:
let result = a1.filter(({ id }) => !a2.find(o => o.id == id));
演示:
let a1 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 },{ id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 }, { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 }, { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },{ id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 }, { id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ];
let a2 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 },{ id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 } ];
let result = a1.filter(({ id }) => !a2.find(o => o.id == id));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我在互联网上搜索了很多,我认为这将是一个非常简单的任务,但我还没有找到任何解决方案
这是我的两个对象数组
第一个数组
[
{ id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 },
{ id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 },
{ id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 },
{ id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 },
{ id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },
{ id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 },
{ id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 }
]
第二个数组
[
{ id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 },
{ id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 },
{ id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 }
]
我想得到两个对象数组之间的差异,我想要这样的结果
第一个数组 - 第二个数组 =(第一个数组中存在但第二个数组中不存在的对象数组)
[ { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 },
{ id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },
{ id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 },
{ id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ]
我试过很多很多方法像这样过滤
let c = existingBillPlans.filter(item =>
!billPlans.some(other => item.x == other.x));
但它给出的是空数组。无法理解我应该做什么。
你快到了,使用 id
而不是 x
existingBillPlans.filter(item => !billPlans.some(other => item.id == other.id));
演示
var existingBillPlans = [{
id: 2,
fees: 10000,
name: 'Yearly Plan',
cycle: 12
},
{
id: 3,
fees: 1500,
name: 'Two Months Plan',
cycle: 2
},
{
id: 4,
fees: 2500,
name: 'Three Months Plan',
cycle: 3
},
{
id: 5,
fees: 3000,
name: 'Four Months Plan',
cycle: 4
},
{
id: 181,
fees: 4000,
name: 'Five Months Plan',
cycle: 5
},
{
id: 182,
fees: 5000,
name: 'Six Months Plan',
cycle: 6
},
{
id: 183,
fees: 6000,
name: 'Seven Months Plan',
cycle: 7
}
]
var billPlans = [{
id: 2,
fees: 10000,
name: 'Yearly Plan',
cycle: 12
},
{
id: 3,
fees: 1500,
name: 'Two Months Plan',
cycle: 2
},
{
id: 4,
fees: 2500,
name: 'Three Months Plan',
cycle: 3
}
]
var output = existingBillPlans.filter(item => !billPlans.some(other => item.id == other.id));
console.log(output);
我想你想检查每个对象的 属性。
要检查对象的所有属性,请使用 every
方法。
let first_array = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 }, { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 }, { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 }, { id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 }, { id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ], second_array = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 } ]
let result = first_array
.filter(item => !second_array
.find(other => Object.keys(other)
.every(prop => item[prop] == other[prop]))
);
console.log(result);
您可以使用 .map()
创建一个 ids
的数组,然后应用 .filter()
let result = (
(array, ids) => array.filter(({ id }) => !ids.includes(id)))(a1, a2.map(({ id }) => id)
);
演示:
let a1 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 }, { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 }, { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },{ id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 },{ id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ];
let a2 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 } ];
let result = (
(array, ids) => array.filter(({ id }) => !ids.includes(id)))(a1, a2.map(({ id }) => id)
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
或者您可以像这样使用 filter()
:
let result = a1.filter(({ id }) => !a2.find(o => o.id == id));
演示:
let a1 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 },{ id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 }, { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 }, { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },{ id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 }, { id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ];
let a2 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 },{ id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 } ];
let result = a1.filter(({ id }) => !a2.find(o => o.id == id));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }