过滤对象数组,并遍历第二个数组以获取条件

时间:2018-06-24 22:09:06

标签: javascript arrays filter ecmascript-5

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

我正在过滤对象数组上的属性值,并将该属性与具有匹配键和布尔值的数组进行交叉引用,以控制是否应将其分解为过滤器。

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

非常感谢...

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

您正在使此操作变得比您需要的复杂。传递给filter()的函数应该返回一个布尔值-您正在返回一个数组。

您可以简单地在filter数组上进行查找过滤,该数组将返回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)

答案 2 :(得分:2)

filter将使用每个返回真实值的item创建一个新数组。这应该起作用:

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