过滤对象数组,并在第二个数组上进行 foreach 条件

Filter on array of objects, and foreach over second array for conditions

几个小时后我遇到了麻烦 -- 想知道是否有新手开发人员可以查看下面的内容,代码已简化以显示问题。

我正在过滤一个对象数组的 属性 值,并用一个具有匹配键的数组和布尔值交叉引用该 属性 以控制它是否应该被纳入过滤器。

但是我的结果是返回所有 3 个对象,尽管 console.log 似乎评估正确。有什么想法吗?

非常感谢...

var data = [{
    "id": 1,
    "status": "new",
  },
  {
    "id": 2,
    "status": "rejected",
  },
  {
    "id": 3,
    "status": "changed",
  }
];

var filter = {
  "new": true,
  "rejected": false,
  "changed": true
}

var result = data.filter(function(item) {
  var arr = [];

  Object.keys(filter).forEach(function(key) {
    if (item.status === key && filter[key] === true) {

      console.log('---')
      console.log('item.status', item.status)
      console.log('key', key)
      console.log('filter[key]', filter[key])
      console.log('---')

      arr.push(item);
    }
  });

  return arr;
});

filter 通过直接返回真实或虚假的东西,而不是通过返回任何更具体的东西(比如一个对象)。您可以将代码简化为一行代码:

var data=[{"id":1,"status":"new",},{"id":2,"status":"rejected",},{"id":3,"status":"changed",}]
var filter = {
  "new": true,
  "rejected": false,
  "changed": true
}

var result = data.filter((item) => filter[item.status])
console.log(result);

你把这件事弄得比你需要的要复杂一些。传递给 filter() 的函数应该 return 一个布尔值——你正在 return 一个数组。

您可以简单地使用 filter 数组上的查找进行过滤,这将是 return falseundefined,在这种情况下您可以将其过滤掉,或者true,在这种情况下你保留它..

var data = [{
    "id": 1,
    "status": "new",
  },
  {
    "id": 2,
    "status": "rejected",
  },
  {
    "id": 3,
    "status": "changed",
  }
];

var filter = {
  "new": true,
  "rejected": false,
  "changed": true
}

var result = data.filter(item => filter[item.status])

console.log(result)

filter 将创建一个新数组,每个 item 返回一个真值。这应该有效:

var result = data.filter(function(item) {
  return filter[item.status];
});