javascript 迭代嵌套对象数组中的对象并按 ids 过滤并返回更新后的相同原始数据集

标签 javascript arrays ecmascript-6

我有一个嵌套对象数组,我想将这些对象保留在 items 中,这些对象的 id 等于我作为引用的过滤器列表中的 1 .

const data = [{
  "otherStuff": "otherB",
  "items": {
    "item1": [{
        "id": "id1",
        "info": "info1"
      },
      {
        "id": "id2",
        "info": "info22"
      }
    ],
    "item20": [{
      "id": "id3",
      "info": "info5"
    }],
    "item5": [{
        "id": "id4",
        "info": "info6"
      },
      {
        "id": "id5",
        "info": "info7"
      }
    ]
  }
}, {
  "otherStuff": "otherA",
  "items": {
    "item1": [{
        "id": "id1",
        "info": "info10000"
      },
      {
        "id": "id2",
        "info": "info220000"
      }
    ],
    "item20": [{
      "id": "id3",
      "info": "info5000"
    }],
    "item5": [{
        "id": "id4",
        "info": "info60000"
      },
      {
        "id": "id5",
        "info": "info7000"
      }
    ]
  }
}];

const keep = ['id4', 'id2'];
keep.forEach(function(val) {
  data.forEach(function(entry, index){
      const entrySelected = [];
      Object.keys(entry.items).forEach(item => {
        var match = entry.items[item].find(obj => obj.id === val);
        if (match) {
          entrySelected.push(match)
        }
      });
      data[index].items = entrySelected;
  });
})
console.log(data)

我现在收到一个错误, 但想法是得到以下输出:

 [
        {
            "otherStuff": "otherB",
            "items": [
                    {
                          "id": "id2",
                          "info": "info22"
                    },
                    {
                        "id": "id4",
                        "info": "info6"
                }
            ]
        },
        {
            "otherStuff": "otherA",
            "items": [
                    {
                          "id": "id2",
                          "info": "info220000"
                    },
                    {
                        "id": "id4",
                        "info": "info60000"
                }
            ]
        }
    ]

我怎样才能实现这个目标?

最佳答案

您可以迭代对象的值,然后减少新数组所需的项目。稍后将其分配给 items

var data = [{ otherStuff: "otherB", items: { item1: [{ id: "id1", info: "info1" }, { id: "id2", info: "info22" }], item20: [{ id: "id3", info: "info5" }], item5: [{ id: "id4", info: "info6" }, { id: "id5", info: "info7" }] } }, { otherStuff: "otherA", items: { item1: [{ id: "id1", info: "info10000" }, { id: "id2", info: "info220000" }], item20: [{ id: "id3", info: "info5000" }], item5: [{ id: "id4", info: "info60000" }, { id: "id5", info: "info7000" }] } }],
    keep = ['id4', 'id2'];

data.forEach(o =>
    o.items = Object
        .keys(o.items)
        .reduce((r, k) => o
            .items[k]
            .reduce((s, p) => s.concat(keep.includes(p.id) ? p : []), r), []));

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

带有数组过滤器。

var data = [{ otherStuff: "otherB", items: { item1: [{ id: "id1", info: "info1" }, { id: "id2", info: "info22" }], item20: [{ id: "id3", info: "info5" }], item5: [{ id: "id4", info: "info6" }, { id: "id5", info: "info7" }] } }, { otherStuff: "otherA", items: { item1: [{ id: "id1", info: "info10000" }, { id: "id2", info: "info220000" }], item20: [{ id: "id3", info: "info5000" }], item5: [{ id: "id4", info: "info60000" }, { id: "id5", info: "info7000" }] } }],
    keep = ['id4', 'id2'];

data.forEach(o =>
    o.items = Object
        .keys(o.items)
        .filter(k => Array.isArray(o.items[k]))
        .reduce((r, k) => o
            .items[k]
            .reduce((s, p) => s.concat(keep.includes(p.id) ? p : []), r), []));

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript 迭代嵌套对象数组中的对象并按 ids 过滤并返回更新后的相同原始数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52172530/

相关文章:

javascript - Webpack Tree-Shaking 动态导入似乎不起作用

javascript - JS 数组 : filter() with map() vs forEach()

javascript - 可以重置而不重叠的计时器? - JavaScript

arrays - 将二维数组公式输出为格式化字符串

arrays - 阵列已确定尺寸 - 类模块

javascript - 扩展 `super()` 时使用 `Object`

javascript - 单击按钮以升序/降序对 Angular 中的数据进行排序

PHP Xpath 抓取可能的命名空间问题

javascript - sheetjs xlsx,如何编写合并单元格?

arrays - 关于数组的问题之间的区别