【问题标题】:Filter on array of objects, and foreach over second array for conditions过滤对象数组,并遍历第二个数组以获取条件
【发布时间】:2018-06-24 22:09:05
【问题描述】:

几个小时后我遇到了一个障碍——想知道一个新的开发人员是否可以查看下面的代码,代码被简化以显示问题。

我在一个对象数组上过滤一个属性值,并用一个数组交叉引用该属性,该数组具有匹配的键和布尔值来控制是否应将其考虑到过滤器中。

但是我的结果是返回所有 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;
});

【问题讨论】:

    标签: javascript arrays filter ecmascript-5


    【解决方案1】:

    您使这比您需要的要复杂一些。传递给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】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-07-19
          • 1970-01-01
          • 2023-01-25
          • 2021-12-21
          • 2021-06-27
          • 2021-07-21
          • 2011-06-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多