繁体   English   中英

如何在javascript中比较数组1[对象数组]与数组2

[英]How to compare array 1[array of objects] with array 2 in javascript

我想将数组 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);

有人帮助我以更好的方式实现相同的目标吗?

将内部 for 循环替换为

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

例如

 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" }]; var arr2 = ["hilter", "arrogant", "cool", "uber"]; function intersect_arrays(a, b) { var matches = a.filter(function(item) { return b.indexOf(item.name) > -1 }); matches = matches.map( function(item){ return item.name } ); return matches; } console.log(intersect_arrays(arr1, arr2))

如果您只想合并数组,请参阅 Array.concat(): http : //www.w3schools.com/jsref/jsref_concat_array.asp

所以你的代码应该是这样的: var mergeArray = arr1.concat(arr2);

这只会把它们放在一起。 如果你想在条件下合并,我认为这不是最好的解决方案。

你可以用这个替换你的两个 for 循环

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

您可以对Array.reduceArray.indexOf使用更实用的方法Array.reduce生成结果。 然而,这与您发布的代码几乎相同,但丑陋的部分已被抽象掉。

 const 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"} ]; const arr2 = ["hilter","arrogant","cool","uber"]; const intersect_arrays = function(arr, keys) { // reduce the array of objects return arr.reduce((acc, x) => { // check if the name property is contained in the keys array if (~keys.indexOf(x.name)) { // add the name to the returned values return acc.concat(x.name) } return acc }, []) } console.log(intersect_arrays(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:

您还可以使用filtermap以更具声明性的方式完成此操作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM