【问题标题】:Create a filtered copy of JavaScript object with arrays使用数组创建 JavaScript 对象的过滤副本
【发布时间】:2021-06-17 07:11:52
【问题描述】:

我是 JavaScript/jQuery 的新手,可能有一种简单的方法可以做到这一点,但我找不到我需要的函数或语法。基本上,我有一组这样的对象:

{
  "Object1": [
    {
      "Value": "ABC",
      "IsEnabled": true
    },
    {
      "Value": "DEF",
      "IsEnabled": false
    }
  ],
  "Object2": [
    {
      "Value": "GHI",
      "IsEnabled": false
    }
  ]
}

并且我想根据“IsEnabled”值等于 true 将它变成一组新的对象。

{
  "Object1": [
    {
      "Value": "ABC",
      "IsEnabled": true
    }
  ]
}

如果它更简单,我也可以不使用新对象,而是删除“IsEnabled”=false 对象的现有对象。任何帮助表示赞赏,谢谢。

【问题讨论】:

  • filter() 方法不是做你想做的事吗?
  • 可能是这样,但我不明白我需要循环遍历对象集中的每个对象并根据 IsEnabled 过滤掉每个对象内部的数组的语法。我尝试的一切要么抛出错误,要么返回 undefined。
  • edit您的问题与您所做的尝试。

标签: javascript jquery arrays javascript-objects


【解决方案1】:

循环遍历外部对象中的属性。对于它们中的每一个,调用filter() 以仅获取数组中启用的对象。如果结果数组不为空,则将其添加到结果中。

const input = {
  "Object1": [
    {
      "Value": "ABC",
      "IsEnabled": true
    },
    {
      "Value": "DEF",
      "IsEnabled": false
    }
  ],
  "Object2": [
    {
      "Value": "GHI",
      "IsEnabled": false
    }
  ]
};

const output = {};

Object.entries(input).forEach(([key, array]) => {
  const new_array = array.filter(el => el.IsEnabled);
  if (new_array.length > 0) {
    output[key] = new_array;
  }
});

console.log(output);

【讨论】:

    【解决方案2】:

    如果你喜欢函数式编程模式,你可以例如使用Object.entries,然后在该对数组上使用mapfilter,最后使用Object.fromEntries

    let obj = {"Object1": [{"Value": "ABC","IsEnabled": true},{"Value": "DEF","IsEnabled": false}],"Object2": [{"Value": "GHI","IsEnabled": false}]};
    
    let result = Object.fromEntries(
        Object.entries(obj)
              .map(([k, arr]) => [k, arr.filter(o => o.IsEnabled)])
              .filter(([, arr]) => arr.length)
    );
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 2016-08-08
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      相关资源
      最近更新 更多