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

IT技术 javascript jquery arrays object filter
2021-01-14 10:45:42

这个问题类似于this one Jquery filter array of object with loop,但这次我需要用一组对象进行过滤。

例子:

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

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"
}]

我怎样才能做到这一点 ?

6个回答

您可以在此处使用几个数组方法 -filtersome. 它们在所有最近的浏览器中都可用,并且有可用于旧浏览器的 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);

嗨@Andy,我正在做同样的事情,只有一个条件改变,not equal to !==但这对我来说不起作用。那么有没有其他方法可以处理不等于条件?在这里查看我的现场示例:playcode.io/586682
2021-03-17 10:45:42
极好的!比使用 for 循环更好!简洁了很多
2021-03-23 10:45:42

使用 Ecma 脚本 6。

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

功能:

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

console.log(filterObjectArray(myArray, myFilter))

链接到示例

为了响应安迪回答上面,我相信现在应该被标记为答案,如果你正在寻找的行为完全相反,使用每个与否定,这样的事情。

const result = masterData.filter(ad => 
             filterData.every(fd => fd.userid !== md.userid));

result包含all masterData except filterData.

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

基于@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));