【问题标题】:Filter array of objects with another array of object用另一个对象数组过滤对象数组
【发布时间】:2018-10-03 11:46:52
【问题描述】:

我想用另一个对象数组过滤一个对象数组。该逻辑将用于按类别和颜色等进行产品搜索。这是我的主要数组:

products: [{
                            id: 1,
                              name: 'Product 1',
                              category: 'Home',
                              skill: 'Easy',
                              color: 'blue',
                              price: 100.00
                            }, {
                                id: 2,
                              name: 'Product 2',
                              category: 'Home',
                              skill: 'Intermediate',
                              color: 'red',
                              price: 120.00
                            }, {
                                id: 3,
                              name: 'Product 3',
                              category: 'Office',
                              skill: 'Intermediate',
                              color: 'green',
                              price: 190.00
                            }, {
                                id: 4,
                              name: 'Product 4',
                              category: 'Office',
                              skill: 'Advanced',
                              color: 'blue',
                              price: 260.00
                            }, {
                                id: 5,
                              name: 'Product 5',
                              category: 'Warehouse',
                              skill: 'Advanced',
                              color: 'white',
                              price: 321.00
                            }, {
                                id: 6,
                              name: 'Product 6',
                              category: 'Farm',
                              skill: 'Intermediate',
                              color: 'red',
                              price: 120.00
                            }, {
                                id: 7,
                              name: 'Product 7',
                              category: 'Space',
                              skill: 'Advanced',
                              color: 'green',
                              price: 150.00
                            }, {
                                id: 8,
                              name: 'Product 8',
                              category: 'Bathroom',
                              skill: 'Easy',
                              color: 'black',
                              price: 9.00
                            }]

我正在像这个数组一样动态创建过滤器。

预期结果是按多个选定的类别和颜色过滤产品数据。

我已经尝试了以下代码:

var filtered = [];
                  for(var arr in self.products){
                     for(var filter in self.selectedFilters){
                         if(self.products[arr].category == self.selectedFilters[filter].category && self.products[arr].color == self.selectedFilters[filter].color){
                            filtered.push(self.products[arr]);
                           }
                     }
                  }
                  console.log(filtered);

【问题讨论】:

  • 有什么尝试?! ,给我们看一些代码
  • 看看here,可能会给你一些想法。
  • 对于 my-filter 中的 user_id 和 project_id 的每个组合,过滤来自 my-array 的元素。您可以将所有过滤结果推送到另一个变量。最后删除所有重复的元素。

标签: javascript arrays object filter lodash


【解决方案1】:

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

myFilter = [
  {
    userid: [
      {
        0: "101"
      },
      {
        1: "102"
      }
    ],
    projectid: [
      {
        0: "11"
      }
    ]
  }
];

const filterFn = (array, filter) => {
  let result = [];
  filter.forEach(element => {
    let keys = Object.keys(element);
    keys.forEach(key => {
      let values = Object.values(element[key]);
      values = values.map(x => Object.values(x)[0]);
      let ans = array.filter(e => {
        if (values.includes(e[key])) return e;
      });
      result = result.concat(ans);
    });
  });
  return result;
};
console.log(filterFn(myArray, myFilter));

【讨论】:

  • 谢谢,Naor,这可行,但我只需要相交的结果。在这种情况下,如果我通过这个过滤器它应该返回 [ { /**id:2**/ "userid": "101", "projectid": "11", "rowid": "1" }, { / **id:3**/ "userid": "102", "projectid": "11", "rowid": "2" }] 我也用精确数组更新了我的问题
【解决方案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);

【讨论】:

  • 您可以在这里使用几个数组方法 - 过滤器和一些。它们适用于所有最新的浏览器,并且有适用于旧版浏览器的 polyfill。
  • 这里是纯javascript的演示链接。也检查一下jsfiddle.net/LznL6tr5/1
  • 谢谢伙计,但不知何故,我将myFilter[filter].userid 视为未定义
  • hai @NabaragPaul 在这里你必须给出一个精确的数组。如果这个答案对你有用。请为这个答案投票
  • 对不起,先生,问题未解。我已经用确切的数组和代码 sn-p 编辑了问题。
猜你喜欢
  • 2021-05-14
  • 2021-10-16
  • 2019-05-05
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多