Javascript 比较两个对象数组,并将匹配值的元素排除到JS中的新数组中
以下是我的JavaScript用例: 我有两个属性匹配的对象数组(id和name) 我的目标是创建另一个只包含不匹配元素的对象数组。像这样:Javascript 比较两个对象数组,并将匹配值的元素排除到JS中的新数组中,javascript,arrays,underscore.js,javascript-objects,lodash,Javascript,Arrays,Underscore.js,Javascript Objects,Lodash,以下是我的JavaScript用例: 我有两个属性匹配的对象数组(id和name) 我的目标是创建另一个只包含不匹配元素的对象数组。像这样: var result = [ {id:1, name:'Sandra'}, {id:3, name:'Peter'} ]; 我知道有一种方法可以做到这一点,从result1开始,将每个对象与result2的对象进行比较,然后比较它们的键,如果不匹配,将值放入另一个对象中,然后将其放入新数组,但我想知道还有没有更优雅的方法,比如使用短划线或
var result = [
{id:1, name:'Sandra'},
{id:3, name:'Peter'}
];
我知道有一种方法可以做到这一点,从result1开始,将每个对象与result2的对象进行比较,然后比较它们的键,如果不匹配,将值放入另一个对象中,然后将其放入新数组,但我想知道还有没有更优雅的方法,比如使用短划线或下划线或类似的方法
谢谢大家! 仅使用内置的JS就可以:
var result1=[
{id:1,名称:'Sandra',类型:'user',用户名:'Sandra'},
{id:2,名称:'John',类型:'admin',用户名:'johnny2'},
{id:3,名称:'Peter',类型:'user',用户名:'pete'},
{id:4,名称:'Bobby',类型:'user',用户名:'be_bob'}
];
var result2=[
{id:2,姓名:'John',电子邮件:'johnny@example.com'},
{id:4,姓名:'Bobby',电子邮件:'bobby@example.com'}
];
var props=['id','name'];
var result=result1.filter(函数(o1){
//筛选出结果2中的(!)项2
return!result2.some(函数(o2){
返回o1.id==o2.id;//假定id是唯一的
});
}).map(功能(o){
//使用reduce创建仅具有所需属性的对象
//并映射以将其作为一个整体应用于过滤后的数组
return props.reduce(函数(newo,name){
newo[name]=o[name];
返回纽沃;
}, {});
});
document.body.innerHTML=''+JSON.stringify(结果,null,4)+
var result = result1.filter(function (o1) {
return !result2.some(function (o2) {
return o1.id === o2.id; // return the ones with equal id
});
});
// if you want to be more clever...
let result = result1.filter(o1 => !result2.some(o2 => o1.id === o2.id));
'';代码>检查lodash中的差异和xor。使用lodash可以获得相同的结果
var result1=[
{id:1,名称:'Sandra',类型:'user',用户名:'Sandra'},
{id:2,名称:'John',类型:'admin',用户名:'johnny2'},
{id:3,名称:'Peter',类型:'user',用户名:'pete'},
{id:4,名称:'Bobby',类型:'user',用户名:'be_bob'}
];
var result2=[
{id:2,姓名:'John',电子邮件:'johnny@example.com'},
{id:4,姓名:'Bobby',电子邮件:'bobby@example.com'}
];
var result3=u1(result1)
.differenceBy(结果2,'id','name')
.map(u.partial(u.pick,u,'id,'name'))
.value();
console.log(result3)代码>
好吧,这取决于具体情况
但是对于just return,包含差异的数组可以通过以下方法实现,当然它是从@1983中获取的
var Obj1 = [
{id:1, name:'Sandra'},
{id:2, name:'John'},
];
var Obj2 = [
{_id:2, name:'John'},
{_id:4, name:'Bobby'}
];
var Obj3 = lodash.differenceWith(Obj1, Obj2, function (o1, o2) {
return o1['id'] === o2['_id']
});
console.log(Obj3);
// {id:1, name:'Sandra'}
我已经寻找了很多解决方案,可以比较两个具有不同属性名称的对象数组(类似于左外连接)。我想出了这个解决办法。这里我用的是Lodash。我希望这对你有帮助
var _ = require('lodash');
var result1 = [
{id:1, name:'Sandra', type:'user', username:'sandra'},
{id:2, name:'John', type:'admin', username:'johnny2'},
{id:3, name:'Peter', type:'user', username:'pete'},
{id:4, name:'Bobby', type:'user', username:'be_bob'}
];
var result2 = [
{id:2, name:'John', email:'johnny@example.com'},
{id:4, name:'Bobby', email:'bobby@example.com'}
];
// filter all those that do not match
var result = types1.filter(function(o1){
// if match found return false
return _.findIndex(types2, {'id': o1.id, 'name': o1.name}) !== -1 ? false : true;
});
console.log(result);
下面是使用Lodash的另一种解决方案:
分享你的研究成果对每个人都有帮助。告诉我们您尝试了什么,以及为什么它不能满足您的需求。这表明你花了时间来帮助自己,它使我们避免重复显而易见的答案,最重要的是,它帮助你得到一个更具体和相关的答案!另请看自己探索:,。试试这个:简单而简洁的答案!最后一行是我在这整页中最喜欢的一行!这应该是最好的答案。单行,无需库。此答案无效!它返回公共元素而不是唯一元素。最后一行非常棒,非常有用:)@BlackEnd若要获取唯一元素而不是公共元素,请将最后一行更改为let result=result1.filter(o1=>!result2.some(o2=>o1.id==o2.id))
返回相反的值isArrayEqual(a1,a2);函数isArrayEquals(){}
var _ = require('lodash');
var result1 = [
{id:1, name:'Sandra', type:'user', username:'sandra'},
{id:2, name:'John', type:'admin', username:'johnny2'},
{id:3, name:'Peter', type:'user', username:'pete'},
{id:4, name:'Bobby', type:'user', username:'be_bob'}
];
var result2 = [
{id:2, name:'John', email:'johnny@example.com'},
{id:4, name:'Bobby', email:'bobby@example.com'}
];
// filter all those that do not match
var result = types1.filter(function(o1){
// if match found return false
return _.findIndex(types2, {'id': o1.id, 'name': o1.name}) !== -1 ? false : true;
});
console.log(result);