javascript 按多个属性和值筛选对象数组

rpppsulh  于 2023-11-15  发布在  Java
关注(0)|答案(5)|浏览(126)

是否可以通过多个值过滤对象数组?
例如,在下面的示例中,我可以通过term_id 5和6过滤它,同时输入car吗?

[  
   {  
      "id":1,
      "term_id":5,
      "type":"car"
   },
   {  
      "id":2,
      "term_id":3,
      "type":"bike"
   },
   {  
      "id":3,
      "term_id":6,
      "type":"car"
   }
]

字符串
当然,如果使用图书馆更容易的话。

lstz6jyr

lstz6jyr1#

你可以用Array.filter来做

var data = [{
    "id": 1,
    "term_id": 5,
    "type": "car"
  },
  {
    "id": 2,
    "term_id": 3,
    "type": "bike"
  },
  {
    "id": 3,
    "term_id": 6,
    "type": "car"
  }
];

var result = data.filter(function(v, i) {
  return ((v["term_id"] == 5 || v["term_id"] == 6) && v.type == "car");
})

console.log(result)

字符串

pbwdgjma

pbwdgjma2#

下面的函数将帮助你。

nestedFilter = (targetArray, filters) => {
          var filterKeys = Object.keys(filters);
          return targetArray.filter(function (eachObj) {
            return filterKeys.every(function (eachKey) {
              if (!filters[eachKey].length) {
                return true; 
              }
              return filters[eachKey].includes(eachObj[eachKey]);
           });
       });
    };

字符串
将此函数与过滤器一起使用,如下所述:

var filters = {
    "id": ["3"],
    "term_id": ["6"],
    "type": ["car","bike"]
}


不要传递空数组。如果数组中没有值,在过滤器中跳过该属性。
结果将被过滤数组。

z4bn682m

z4bn682m3#

你可以用普通的js filter()方法来做这件事,并使用&&来测试这两个条件。

var data = [{"id":1,"term_id":5,"type":"car"},{"id":2,"term_id":3,"type":"bike"},{"id":3,"term_id":6,"type":"car"}];

var result = data.filter(function(e) {
  return [5, 6].includes(e.term_id) && e.type == 'car'
});

console.log(result);

字符串

t5fffqht

t5fffqht4#

另一种方法是使用lodash filter + reduce。

const arr = [{"id":1,"term_id":5,"type":"car"},{"id":2,"term_id":3,"type":"bike"},{"id":3,"term_id":6,"type":"car"}];

const result = [
  {term_id: 5, type: 'car'},
  {term_id: 6, type: 'car'},
].reduce((prev, orCondition) => prev.concat(_.filter(arr, orCondition)), []);

console.log(result);

个字符

qyuhtwio

qyuhtwio5#

我只需要这样做,看起来像下面的工作:

let termFilter = [5,6]
let typeFilter = ['car']
let result = data.filter(({type,term_id}) => termFilter.includes(term_id) && typeFilter.includes(type))

字符串
我添加了数组以规范化代码,使其具有可扩展性和可读性。
如果保证条件永远不会改变,那么在一行中,你可以这样做:

let result = data.filter(({type,term_id}) => [5,6].includes(term_id) && type == 'car')

相关问题