Recursively filter array of objects

后端 未结 7 946
一个人的身影
一个人的身影 2020-11-29 00:00

Hitting a wall with this one, thought I would post it here in case some kind soul has come across a similar one. I have some data that looks something like this:

<         


        
7条回答
  •  南笙
    南笙 (楼主)
    2020-11-29 00:15

    Here is a good solution which utilizes the array reduce function which results in more readable code then the other solutions. Also it is more readable in my opinion. We are calling the filter function recursively to filter an array along with its children

    const input = [
      {
        value: "Miss1",
        children: [
          { value: "Miss2" },
          { value: "Hit1", children: [{ value: "Miss3" }] },
        ],
      },
      {
        value: "Miss4",
        children: [
          { value: "Miss5" },
          { value: "Miss6", children: [{ value: "Hit2" }] },
        ],
      },
      {
        value: "Miss7",
        children: [
          { value: "Miss8" },
          { value: "Miss9", children: [{ value: "Miss10" }] },
        ],
      },
      {
        value: "Hit3",
        children: [
          { value: "Miss11" },
          { value: "Miss12", children: [{ value: "Miss13" }] },
        ],
      },
      {
        value: "Miss14",
        children: [
          { value: "Hit4" },
          { value: "Miss15", children: [{ value: "Miss16" }] },
        ],
      },
    ];
    
    function recursiveFilter(arr) {
      return arr.reduce(function filter(prev, item) {
        if (item.value.includes("Hit")) {
          if (item.children && item.children.length > 0) {
            return prev.concat({
              ...item,
              children: item.children.reduce(filter, []),
            });
          } else {
            return item;
          }
        }
        return prev;
      }, []);
    }
    
    console.log(recursiveFilter(input));

提交回复
热议问题