Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 比较两个对象数组,并将匹配值的元素排除到JS中的新数组中_Javascript_Arrays_Underscore.js_Javascript Objects_Lodash - Fatal编程技术网

Javascript 比较两个对象数组,并将匹配值的元素排除到JS中的新数组中

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的对象进行比较,然后比较它们的键,如果不匹配,将值放入另一个对象中,然后将其放入新数组,但我想知道还有没有更优雅的方法,比如使用短划线或

以下是我的JavaScript用例:

我有两个属性匹配的对象数组(id和name)

我的目标是创建另一个只包含不匹配元素的对象数组。像这样:

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);