[英]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.reduce
和Array.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:
您还可以使用filter和map以更具声明性的方式完成此操作。
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.