es6 通过过滤器对象数组过滤对象数组

stu*_*ain 2 javascript filter

给定以下结构:

let filteredTasks = [
  {status: 'done', other: true},
  {status: 'nope', other: false},
  {status: 'done', other: true},
  {status: 'done', other: true},
  {status: 'done', other: false},
  {status: 'done', other: false},
  {status: 'started', other: false}
]
Run Code Online (Sandbox Code Playgroud)

和:

let availableFilters = [{status: 'done'}, {other: false}]
Run Code Online (Sandbox Code Playgroud)

如何过滤此数组以获得以下结果:

filteredTasks =
[{status: 'done', other: false}, {status: 'done', other: false}]
Run Code Online (Sandbox Code Playgroud)

我的想法和尝试:

let filteredTasks = [
  {status: 'done', other: true},
  {status: 'nope', other: false},
  {status: 'done', other: true},
  {status: 'done', other: true},
  {status: 'done', other: false},
  {status: 'done', other: false},
  {status: 'started', other: false}
]

let availableFilters = [{status: 'done'}, {other: false}]

let filteredTasksList = availableFilters.map(item => {
    return runFilter(item)
})

function runFilter(currentFilter) {
  return filteredTasks.filter(item => {
    for (var key in currentFilter) {
        if (item[key] === undefined || item[key] !== currentFilter[key])
        return false
    }
    return true;
  })
}
Run Code Online (Sandbox Code Playgroud)

...但显然这是覆盖每一次传递。

与往常一样,非常感谢任何反馈和帮助,所以提前致谢。

编辑:接受最初的评论作为解决方案,因为它符合我的需要。我用它更进一步:

let filterTaskList = (list, filters) => {
  let entries = Object.entries(Object.assign(...filters))
  return list.filter(task => {
    return entries.every(([key, val]) => {
      return task[key] === val
     })
  })
}
Run Code Online (Sandbox Code Playgroud)

Nin*_*olz 5

您可以创建过滤器的单个对象并获取过滤条目。

let filteredTasks = [
  {status: 'done', other: true},
  {status: 'nope', other: false},
  {status: 'done', other: true},
  {status: 'done', other: true},
  {status: 'done', other: false},
  {status: 'done', other: false},
  {status: 'started', other: false}
],
 availableFilters = [{status: 'done'}, {other: false}], // your filters
  filters = Object.entries(Object.assign(...availableFilters)), // returns an array of the filter's own enumerable property
  result = filteredTasks.filter(o => filters.every(([k, v]) => o[k] === v)); // .every returns true, when every item is fulfilling the condition
  
console.log(result);
  
Run Code Online (Sandbox Code Playgroud)