【问题标题】:Get the branch of collection without the sibling elements, searching by property获取没有兄弟元素的集合分支,按属性搜索
【发布时间】:2021-11-11 04:11:45
【问题描述】:

我有具有下一个结构的对象:

let array = [
      {
        name: 'Name1',
        items: [
          {
            name: 'Name1.1',
            items: [
              { id: '1', name: 'Name1.1.1' },
              { id: '2', name: 'Name1.1.2' },
              { id: '3', name: 'Name1.1.3' },
              ...
            ],
          },
          {
            name: 'Name1.2',
            items: [
              { id: '4', name: 'Name1.2.1' },
              { id: '5', name: 'Name1.2.2' },
            ],
          },
        ],
      },
      {
        name: 'Name2',
        items: [
          {
            name: 'Name2.1',
            items: [
              { id: '6', name: 'Name2.1.1' },
              { id: '7', name: 'Name2.1.2' },
            ],
          },
        ],
      },
    ];

我想得到没有兄弟元素的分支,按 id 搜索。期望的结果是 id = '4' 的下一个结构:

let array = [
      {
        name: 'Name1',
        items: [
          {
            name: 'Name1.2',
            items: [
              { id: '4', name: 'Name1.2.1' },
            ],
          },
        ],
      }
    ];

我只能找到树的结尾元素 ({ id: '4', name: 'Name1.2.1' })。但我不明白如何获得树的中间结构。

const test = (data, id) => {
    if (!data || !data.length) return null;

    for (var j = 0; j < data.length; j++) {
      var result = data[j].items
        ? test(data[j].items, id)
        : data[j].id
        ? data[j].id === id
          ? data[j]
          : undefined
        : undefined;

      if (result !== undefined) {
        return result;
      }
    }

    return undefined;
  };

test(array, '4');

【问题讨论】:

    标签: javascript arrays reactjs algorithm tree


    【解决方案1】:

    您确实应该采用递归方法,但您的函数目前只能返回id 值(字符串)或nullundefined。它从不返回数组,但这是您期望得到的。

    当找到一个解决方案作为基本案例时,每次退出递归树时,您都需要将该解决方案包装在一个数组和普通对象中。

    这是一个可行的解决方案:

    function getPath(forest, targetid) {
        for (let root of forest) {
            if (root.id === targetid) return [root]; // base case
            let items = root.items && getPath(root.items, targetid);
            if (items) return [{ ...root, items }];  // wrap!
        }
    }
    
    // Example run:
    let array = [{name: 'Name1',items: [{name: 'Name1.1',items: [{ id: '1', name: 'Name1.1.1' },{ id: '2', name: 'Name1.1.2' },{ id: '3', name: 'Name1.1.3' },],},{name: 'Name1.2',items: [{ id: '4', name: 'Name1.2.1' },{ id: '5', name: 'Name1.2.2' },],},],},{name: 'Name2',items: [{name: 'Name2.1',items: [{ id: '6', name: 'Name2.1.1' },{ id: '7', name: 'Name2.1.2' },],},],},];
    console.log(getPath(array, '4'));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      相关资源
      最近更新 更多