GtA*_*ine 9 javascript arrays jquery object filter
这个问题类似于这个带有循环的Jquery过滤器数组,但这次我需要用一个对象数组来做过滤器.
例:
我有一个这样的对象数组:
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"
}
...]
Run Code Online (Sandbox Code Playgroud)
我想用这样的数组过滤它:
myFilter = [
{
userid: "101",
projectid: "11"
},
{
userid: "102",
projectid: "12"
},
{
userid: "103",
projectid: "11"
}]
Run Code Online (Sandbox Code Playgroud)
并返回此(myFilter中的userid和projectid需要匹配myArray中的userid和projectid):
myArrayFiltered = [
{
userid: "101",
projectid: "11",
rowid: "1"
},
{
userid: "102",
projectid: "12",
rowid: "2"
}]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点 ?
And*_*ndy 26
你可以在这里使用几个数组方法 - filter和some.它们在所有最近的浏览器中都可用,并且旧版浏览器可以使用polyfill.
const 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" }];
const myFilter = [{ userid: "101", projectid: "11" }, { userid: "102", projectid: "12" }, { userid: "103", projectid: "11"}];
const myArrayFiltered = myArray.filter((el) => {
return myFilter.some((f) => {
return f.userid === el.userid && f.projectid === el.projectid;
});
});
console.log(myArrayFiltered);Run Code Online (Sandbox Code Playgroud)
Ren*_*nes 12
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);
Run Code Online (Sandbox Code Playgroud)
Tri*_*una 10
为了响应安迪回答上面,我相信现在应该被标记为答案,如果你正在寻找的行为完全相反,使用每个与否定,这样的事情。
const result = masterData.filter(ad =>
filterData.every(fd => fd.userid !== md.userid));
Run Code Online (Sandbox Code Playgroud)
result包含all masterData except filterData.
基于@Renato 他的回答,但更短:
const myArray = [{ userid: "100", projectid: "10", rowid: "0" }, ...];
const myFilter = [{ userid: "101", projectid: "11" }, ...];
const myArrayFiltered = myArray.filter(array => myFilter.some(filter => filter.userid === array.userid && filter.projectid === array.projectid));
Run Code Online (Sandbox Code Playgroud)
此代码不仅会匹配 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);
Run Code Online (Sandbox Code Playgroud)
所以你可以使用
myFilter = [
{
projectid: "11"
},
{
userid: "101"
},
{
userid: "103",
projectid: "13",
rowid: "3"
}
];
Run Code Online (Sandbox Code Playgroud)
将返回
[ { userid: '101', projectid: '11', rowid: '1' },
{ userid: '103', projectid: '13', rowid: '3' },
{ userid: '101', projectid: '10', rowid: '4' } ]
Run Code Online (Sandbox Code Playgroud)
这意味着所有元素
(projectid=="11")
OR (userid=="101")
OR ( (userid=="103") AND (projectid=="13") AND (rowid=="3") )
Run Code Online (Sandbox Code Playgroud)
你需要循环你的第一个数组,在这个循环中,在过滤器中再次循环。
如果 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);
Run Code Online (Sandbox Code Playgroud)
使用Ecma脚本6。
const myArrayFiltered = myArray.filter( el => {
return myfilter.some( f => {
return f.userid === el.userid && f.projectid === el.projectid;
});
});
Run Code Online (Sandbox Code Playgroud)
功能:
const filterObjectArray = (arr, filterArr) => (
arr.filter( el =>
filterArr.some( f =>
f.userid === el.userid && f.projectid === el.projectid
)
)
);
console.log(filterObjectArray(myArray, myFilter))
Run Code Online (Sandbox Code Playgroud)