【问题标题】:filter out a deeply nested object and return a new object过滤掉一个深度嵌套的对象并返回一个新对象
【发布时间】:2016-10-21 14:29:49
【问题描述】:

我有一个像这样的 4 级嵌套对象

{
  "name": "“Mike”",
  "id": 1000,
  "img": "“#”",
  "children": [
    {
      "name": "“Jack”",
      "id": 1100,
      "img": "#",
      "married": true,
      "children": [
        {
          "name": "”Julia“",
          "id": 1110,
          "img": "#"
        }
      ]
    },
    {
      "name": "”Lily“",
      "id": 1200,
      "img": "#",
      "married": true,
      "children": [
        {
          "name": "”Coco“",
          "id": 1210,
          "img": "#",
          "married": true,
          "children": {
            "name": "”Olivia“",
            "id": 1211,
            "img": "#",
            "married": false
          }
        }
      ]
    }
  ]
}

我有一个 idToDisplay = ["1000","1100","1200","1210"] 数组 我想过滤掉 ID 并去掉不匹配 idToDisplay 的部分,这样我就可以得到一个看起来像这样的新对象

{
  "name": "“Mike”",
  "id": 1000,
  "img": "“#”",
  "children": [
    {
      "name": "“Jack”",
      "id": 1100,
      "img": "#",
      "married": true,
      ]
    },
    {
      "name": "”Lily“",
      "id": 1200,
      "img": "#",
      "married": true,
      "children": [
        {
          "name": "”Coco“",
          "id": 1210,
          "img": "#",
          "married": true,
        }
      ]
    }
  ]
}

迭代的最佳方式是什么?非常感谢!

【问题讨论】:

    标签: json loops object filter lodash


    【解决方案1】:

    如果您只想就地修改数据,可以像这样递归遍历它:

    var data = ... your data ...
    var ids = [1000, 1100]
    var handleNode = function(node) {
        node.children = node.children.filter(x => ids.includes(x.id))
        node.children.forEach(handleNode)
    }
    if (!ids.includes(data.id)) {data = {}}
    handleNode(data)
    

    之后您的数据仅包含具有匹配 ID 的节点。

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 2020-08-02
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多