使用另一个对象数组过滤对象数组

这个问题类似于这个带有循环的对象的Jqueryfilter数组,但这次我需要用一个对象数组来做filter。

例:

我有一个像这样的对象数组:

myArray = [ { userid: "100", projectid: "10", rowid: "0" }, { userid: "101", projectid: "11", rowid: "1"}, { userid: "102", projectid: "12", rowid: "2"}, { userid: "103", projectid: "13", rowid: "3" }, { userid: "101", projectid: "10", rowid: "4" } ...] 

我想用这样的数组过滤它:

 myFilter = [ { userid: "101", projectid: "11" }, { userid: "102", projectid: "12" }, { userid: "103", projectid: "11" }] 

并返回此(myFilter中的userid和projectid需要匹配myArray中的userid和projectid):

 myArrayFiltered = [ { userid: "101", projectid: "11", rowid: "1" }, { userid: "102", projectid: "12", rowid: "2" }] 

我怎样才能做到这一点 ?

 var filtered = []; for(var arr in myArray){ for(var filter in myFilter){ if(myArray[arr].userid == myFilter[filter].userid && myArray[arr].projectid == myFilter[filter].projectid){ filtered.push(myArray[arr].userid); } } } console.log(filtered); 

你可以在这里使用几个数组方法 – filtersome 。 它们在所有最近的浏览器中都可用,并且旧版浏览器可以使用polyfill。

 var myArrayFiltered = myArray.filter(function (el) { return myFilter.some(function (f) { return f.userid === el.userid && f.projectid === el.projectid; }); }); 

DEMO

您需要遍历第一个数组,并在此循环内,再次在filter内循环。

如果userid和projectid等于,则可以将该行添加到已过滤的数组中:

 myArray = [{ userid: "100", projectid: "10", rowid: "0" }, { userid: "101", projectid: "11", rowid: "1" }, { userid: "102", projectid: "12", rowid: "2" }, { userid: "103", projectid: "13", rowid: "3" }, { userid: "101", projectid: "10", rowid: "4" }]; myFilter = [{ userid: "101", projectid: "11" }, { userid: "102", projectid: "12" }, { userid: "103", projectid: "11" }]; function filterArray(array, filter) { var myArrayFiltered = []; for (var i = 0; i < array.length; i++) { for (var j = 0; j < filter.length; j++) { if (array[i].userid === filter[j].userid && array[i].projectid === filter[j].projectid) { myArrayFiltered.push(array[i]); } } } return myArrayFiltered; } myArrayFiltered = filterArray(myArray, myFilter); console.log(myArrayFiltered); 

的jsfiddle

你可以使用jquery map,这返回一个匹配数组:

 var _filter=function(arr_data,arr_filter){ return $.map( arr_data, function( n ) { for(var f in arr_filter){ if(arr_filter[f].userid == n.userid && arr_filter[f].projectid == n.projectid){ return n; } } }); } var resp = _filter(myArray,myFilter); console.log(resp); 

此代码不仅与userid和projectid匹配,还与myFilter [j]的所有属性匹配。

 var filtered = myArray.filter(function(i){ return myFilter.some(function(j){ return !Object.keys(j).some(function(prop){ return i[prop] != j[prop]; }); }); }); console.log(filtered); 

所以你可以使用

 myFilter = [ { projectid: "11" }, { userid: "101" }, { userid: "103", projectid: "13", rowid: "3" } ]; 

将返回

 [ { userid: '101', projectid: '11', rowid: '1' }, { userid: '103', projectid: '13', rowid: '3' }, { userid: '101', projectid: '10', rowid: '4' } ] 

这意味着所有的元素

 (projectid=="11") OR (userid=="101") OR ( (userid=="103") AND (projectid=="13") AND (rowid=="3") ) 

用Ecma脚本6。

 const myArrayFiltered = myArray.filter( el => { return myfilter.some( f => { return f.userid === el.userid && f.projectid === el.projectid; }); }); 

function:

 const filterObjectArray = (arr, filterArr) => ( arr.filter( el => filterArr.some( f => f.userid === el.userid && f.projectid === el.projectid ) ) ); console.log(filterObjectArray(myArray, myFilter)) 

链接到示例

如果需要这样的filter,我建议创建一个字典(对象),其键是属性的散列,定义匹配(在本例中为userid和projectid),这样你需要迭代第一个dict(haystack)到检查第二个dict(针)是否有钥匙。 希望这可以帮助。