【问题标题】:Recursive looping over array of objects using reduce使用reduce对对象数组进行递归循环
【发布时间】:2019-01-05 23:52:32
【问题描述】:

我有一组带有孩子的对象。目标是从 items 数组中删除每个项目。

是否可以不使用 forEach 和 map 循环?这种情况下如何使用reduce?

问题是一些数组在一层有项目,而另一些则有子数组,里面有项目。示例:

{
  "label": "child1",
  "children": [
    {
      "label": "child2",
      "items": [
        "item1",
        "item2"
      ]
    },
    {
      "label": "child3",
      "items": [
        "item1",
        "item2",
        "item3"
      ]
    }
  ]
}

因此,我希望看到一个带有空项数组的对象的变异数组。 这是一个要变异的对象:

[
  {
    "label": "parent",
    "children": [
      {
        "label": "child1",
        "children": [
          {
            "label": "child2",
            "items": [
              "item1",
              "item2"
            ]
          },
          {
            "label": "child3",
            "items": [
              "item1",
              "item2",
              "item3"
            ]
          }
        ]
      },
      {
        "label": "child4",
        "items": []
      },
      {
        "label": "child5",
        "items": ["item1","item2"]
      }
    ]
  }
]

这是我不完整的解决方案:

function flattenDeep(arr) {
  return arr.reduce(
    (acc, val) =>
      Array.isArray(val)
        ? acc.concat(flattenDeep(val.children))
        : acc.concat(val.children),
    []
  );
}

【问题讨论】:

  • 请添加您的尝试和想要的结果。你想获得新的数组/对象,还是改变原来的?
  • 我只想改变这个。我试图用 forEach 和 map 来做,但看起来不太好。
  • 我没有正确的工作解决方案。我的代码无法处理同一级别的不同对象。理想情况下,它应该使用 reduce 来完成。

标签: javascript arrays recursion reduce


【解决方案1】:

这是一种清空所有items 数组的方法。

这个想法是使用一个可以递归使用的预定义reducer方法。

const reducer = (reduced, element) => {
  // empty items array
  if (element.items) {
    element.items.length = 0;
  }
  // if element has children, recursively empty items array from it
  if (element.children) {
   element.children = element.children.reduce(reducer, []);
  }
  return reduced.concat(element); // or: [...reduced, element]
};

document.querySelector("pre").textContent = 
   JSON.stringify(getObj().reduce(reducer, []), null, " ");

// to keep relevant code on top of the snippet
function getObj() {
  return [
    {
      "label": "parent",
      "children": [
        {
          "label": "child1",
          "children": [
            {
              "label": "child2",
              "items": [
                "item1",
                "item2"
              ]
            },
            {
              "label": "child3",
              "items": [
                "item1",
                "item2",
                "item3"
              ]
            }
          ]
        },
        {
          "label": "child4",
          "items": []
        },
        {
          "label": "child5",
          "items": ["item1","item2"]
        }
      ]
    }
  ];
}
<pre></pre>

【讨论】:

  • 谢谢,这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 2015-12-30
  • 2020-12-06
  • 2021-05-19
  • 2018-12-16
  • 2018-09-03
  • 1970-01-01
相关资源
最近更新 更多