如何在javascript中比较数组1[array of objects]和数组2

如何在javascript中比较数组1[array of objects]和数组2,javascript,arrays,Javascript,Arrays,我想将数组1与数组2进行比较,数组1有一个对象数组。数组2中可用的任何项目都应该在数组1中可用。如果是这样,那么我必须将项目从数组2推送到新数组,然后返回新创建的finalArray。 我编写了代码,正如我所提到的,它工作得很好,但是,下面的代码执行了“for循环”许多我不想要的项目 我想避免许多循环执行 var arr1 = [{"count":1,"name":"hitler"},{"count":1,"name":"cool"},{"count":1,"name":"cooola"},{"

我想将数组1与数组2进行比较,数组1有一个对象数组。数组2中可用的任何项目都应该在数组1中可用。如果是这样,那么我必须将项目从数组2推送到新数组,然后返回新创建的finalArray。 我编写了代码,正如我所提到的,它工作得很好,但是,下面的代码执行了“for循环”许多我不想要的项目

我想避免许多循环执行

var arr1 = [{"count":1,"name":"hitler"},{"count":1,"name":"cool"},{"count":1,"name":"cooola"},{"count":1,"name":"cute"},{"count":1,"name":"nyle"},{"count":1,"name":""},{"count":1,"name":"path"},{"count":1,"name":"root"},{"count":1,"name":"sssstag"},{"count":1,"name":"ssssu tag"},{"count":1,"name":"sutag"},{"count":1,"name":"tag2"},{"count":1,"name":"arrogant"},{"count":1,"name":"test01"},{"count":1,"name":"test10"},{"count":1,"name":"uber"},{"count":1,"name":"union"},{"count":1,"name":"assettag"},{"count":1,"name":"wire"}];

function intersect_arrays(a, b) {

    var matches = [];

    for ( var i = 0; i < a.length; i++ ) {
        for ( var e = 0; e < b.length; e++ ) {
            if ( a[i].name === b[e] ) matches.push( b[e] );
        }
    }
    return matches;
}


var arr2 = ["hilter","arrogant","cool","uber"];

var finalArray = intersect_arrays(arr1, arr2);
console.log(finalArray);
var arr1=[{“count”:1,“name”:“hitler”},{“count”:1,“name”:“cool”},{“count”:1,“name”:“cute”},{“count”:1,“name”:“nyle”},{“count”:1,“name”:“name”},{“count”:1,“name”:“path”},{“count”:1,“name”:“root”},{“count”count 1,“name”:“sstag”},{“name”{“sstag”},{“count 1”,name“:“sstag:1,“名称”:“傲慢”},{“计数”:1,“名称”:“测试01”},{“计数”:1,“名称”:“测试10”},{“计数”:1,“名称”:“优步”},{“计数”:1,“名称”:“联合”},{“计数”:1,“名称”:“资产负债”},{“计数”:1,“名称”:“电线”};
函数数组(a,b){
var匹配=[];
对于(变量i=0;i

有谁能帮我找到更好的方法来实现同样的效果吗?

如果您只想合并数组,请参阅Array.concat():

所以你的代码是这样的: var mergedArray=arr1.concat(arr2)


这将把它们放在一起。如果要在条件下合并,我认为这不是最佳解决方案。

将内部for循环替换为

var matches = a.filter( function(item){ return b.indexOf( item.name ) > -1 } );
比如说

var arr1=[{
“计数”:1,
“姓名”:“希特勒”
}, {
“计数”:1,
“名称”:“酷”
}, {
“计数”:1,
“名称”:“库奥拉”
}, {
“计数”:1,
“姓名”:“可爱”
}, {
“计数”:1,
“名称”:“nyle”
}, {
“计数”:1,
“名称”:”
}, {
“计数”:1,
“名称”:“路径”
}, {
“计数”:1,
“名称”:“根”
}, {
“计数”:1,
“名称”:“SSTAG”
}, {
“计数”:1,
“名称”:“ssssu标签”
}, {
“计数”:1,
“名称”:“sutag”
}, {
“计数”:1,
“名称”:“tag2”
}, {
“计数”:1,
“姓名”:“傲慢”
}, {
“计数”:1,
“名称”:“test01”
}, {
“计数”:1,
“名称”:“test10”
}, {
“计数”:1,
“名称”:“优步”
}, {
“计数”:1,
“名称”:“联合”
}, {
“计数”:1,
“名称”:“资产”
}, {
“计数”:1,
“名称”:“导线”
}];
var arr2=[“希尔特”、“傲慢”、“酷”、“优步”];
函数数组(a,b){
var matches=a.filter(函数(项){
返回b.indexOf(item.name)>-1
});
matches=matches.map(函数(项){return item.name});
返回比赛;
}

log(intersect_arrays(arr1,arr2))
您可以用这个替换两个for循环

for ( var i = 0; i < a.length; i++ ) {
    if (b[e].indexOf(a[i].name) != -1) {
        matches.push( b[e] );
    }
}
for(变量i=0;i
您可以对
Array.reduce
Array.indexOf
使用功能更强大的方法来生成结果。然而,这与您发布的代码几乎相同,但是丑陋的部分已经被抽象掉了

const arr1=[
{“伯爵”:1,“名字”:“希特勒”},{“伯爵”:1,“名字”:“酷”},
{“count”:1,“name”:“cooola”},{“count”:1,“name”:“cute”},
{“count”:1,“name”:“nyle”},{“count”:1,“name”:“},
{“计数”:1,“名称”:“路径”},{“计数”:1,“名称”:“根”},
{“计数”:1,“名称”:“sssstag”},{“计数”:1,“名称”:“ssssu标记”},
{“count”:1,“name”:“sutag”},{“count”:1,“name”:“tag2”},
{“count”:1,“name”:“傲慢”},{“count”:1,“name”:“test01”},
{“count”:1,“name”:“test10”},{“count”:1,“name”:“uber”},
{“count”:1,“name”:“union”},{“count”:1,“name”:“assettag”},
{“count”:1,“name”:“wire”}
];
常量arr2=[“希尔特”,“傲慢”,“酷”,“优步];
常量intersect_数组=函数(arr,键){
//减少对象数组
返回arr.reduce((acc,x)=>{
//检查Key数组中是否包含name属性
if(~keys.indexOf(x.name)){
//将名称添加到返回的值中
返回acc.concat(x.name)
}
返回acc
}, [])  
}  

log(intersect_数组(arr1,arr2))
这里有几个选项:

选项1

使用indexOf避免第二个循环

var arr1 = [{"count":1,"name":"hitler"},{"count":1,"name":"cool"},{"count":1,"name":"cooola"},{"count":1,"name":"cute"},{"count":1,"name":"nyle"},{"count":1,"name":""},{"count":1,"name":"path"},{"count":1,"name":"root"},{"count":1,"name":"sssstag"},{"count":1,"name":"ssssu tag"},{"count":1,"name":"sutag"},{"count":1,"name":"tag2"},{"count":1,"name":"arrogant"},{"count":1,"name":"test01"},{"count":1,"name":"test10"},{"count":1,"name":"uber"},{"count":1,"name":"union"},{"count":1,"name":"assettag"},{"count":1,"name":"wire"}];

function intersect_arrays(a, b) {
var matches = [];        
a.forEach(function(item){
  if(b.indexOf(item.name) > -1) {
    matches.push(item.name);
  }
});
return matches;
}


var arr2 = ["hilter", "arrogant", "cool", "uber"];

var finalArray = intersect_arrays(arr1, arr2);

console.log(finalArray);
选项2:

您还可以使用过滤器映射以更具声明性的方式进行操作

var arr1 = [{"count":1,"name":"hitler"},{"count":1,"name":"cool"},{"count":1,"name":"cooola"},{"count":1,"name":"cute"},{"count":1,"name":"nyle"},{"count":1,"name":""},{"count":1,"name":"path"},{"count":1,"name":"root"},{"count":1,"name":"sssstag"},{"count":1,"name":"ssssu tag"},{"count":1,"name":"sutag"},{"count":1,"name":"tag2"},{"count":1,"name":"arrogant"},{"count":1,"name":"test01"},{"count":1,"name":"test10"},{"count":1,"name":"uber"},{"count":1,"name":"union"},{"count":1,"name":"assettag"},{"count":1,"name":"wire"}];

function intersectArrays(a, b) {
return a.filter(function(item){
  return (b.indexOf(item.name) > -1)
});
}


var arr2 = ["hilter", "arrogant", "cool", "uber"];

var finalArray = intersectArrays(arr1, arr2).map(function(item) {
  return item.name;
});

console.log(finalArray);

抱歉,格式错误。编写了此手机,因此没有可用的格式。将更新。您误解了。我不想合并,我想检查array1,如果它可用,然后推到新的数组。您可以通过删除匹配的对象来优化它。您只想匹配name属性的基属性或某些其他属性的组合。在本例中,有两个属性,但您要与名称属性匹配。我只想与“名称”属性匹配。我不认为您可以比嵌套for循环做得更好。对于
b
中的每个元素,您需要查看
a
中的每个元素。您收到的一些答案使用高阶函数更具可读性,但我相信它们执行相同数量的操作。另外,为什么在代码中使用“希特勒”?奇怪的选择。对许多人来说,这个名字与种族灭绝有关。