使用另一个对象数组过滤对象数组
这个问题类似于这个带有循环的对象的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);
你可以在这里使用几个数组方法 – filter
和some
。 它们在所有最近的浏览器中都可用,并且旧版浏览器可以使用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(针)是否有钥匙。 希望这可以帮助。