代码之家  ›  专栏  ›  技术社区  ›  user3142695

JS:按特定顺序获取对象的ID

  •  0
  • user3142695  · 技术社区  · 7 年前

    我需要以正确的层次顺序获取一组对象的所有ID。

    更新:

    [
      { _id: 'abc', parent: 'mainID', main: 'mainID', order: 1, type: 'item' },
      { _id: 'def', parent: 'mainID', main: 'mainID', order: 2, type: 'item' },
      { _id: 'ghi', parent: 'mainID', main: 'mainID', order: 3, type: 'group' },
      { _id: 'jkl', parent: 'ghi', main: 'mainID', order: 1, type: 'item' },
      { _id: 'mno', parent: 'ghi', main: 'mainID', order: 2, type: 'group' },
      { _id: 'pqr', parent: 'mno', main: 'mainID', order: 1, type: 'item' },
      { _id: 'stu', parent: 'mainID', main: 'mainID', order: 4, type: 'item' }
    ]
    

    让我简单解释一下我的数据结构: 有几个项目( type )。在第一级中,所有项目/组都有父项 mainID

    因此,对于第一级元素,ID为: ['abc','def','ghi','stu'] . ghi )是一个 ghi .

    初始数组中的对象可以具有无序顺序,这就给我带来了问题。 每个级别中元素的顺序由顺序值(升序)确定。

    [
      { _id: 'ghi', parent: 'mainID', main: 'mainID', order: 3, type: 'group' },
      { _id: 'jkl', parent: 'ghi', main: 'mainID', order: 1, type: 'item' },
      { _id: 'mno', parent: 'ghi', main: 'mainID', order: 2, type: 'group' },
      { _id: 'pqr', parent: 'mno', main: 'mainID', order: 1, type: 'item' },
      { _id: 'stu', parent: 'mainID', main: 'mainID', order: 4, type: 'item' },
      { _id: 'abc', parent: 'mainID', main: 'mainID', order: 1, type: 'item' },
      { _id: 'def', parent: 'mainID', main: 'mainID', order: 2, type: 'item' }
    ]
    

    abc
    def
    ghi
      jkl
      mno
        pqr
    stu
    

    我需要的是按从上到下的顺序排列的ID

    因此,结果应该是:

    ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu']
    

    由于嵌套结构,我的尝试无效:

    (elements) => {
      const result = []
      elements
        .filter(item => (item.parent === item.main))
        .forEach(elm => {
          result.push(elm._id)
          if (elm.type === 'group') {
            getOrderedId(elements, elm._id)
          }
        })
      return result
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   trincot    7 年前

    我首先创建一个地图,用 _id main 条目,即根。

    然后迭代输入,将每个对象注入到上述树结构的适当数组中。

    然后在树结构中执行顺序遍历(使用递归),并在访问对象时生成对象。

    以下代码假定:

    • 主要的 财产)。
    • 这个 order

    这个 type 属性未使用--它是冗余信息。

    function ordered(elements) {
        if (!elements.length) return [];
        const rootId = elements[0].main;
        const children = new Map(elements.map(e => [e._id, []])).set(rootId, []);
        elements.forEach(e => children.get(e.parent)[e.order-1] = e);
        return [...(function * visit(id) {
            if (!children.has(id)) return;
            for (let child of children.get(id)) {
                yield child;
                yield * visit(child._id);
            }
        })(rootId)];
    }
    
    const elements = [{ _id: 'ghi', parent: 'mainID', main: 'mainID', order: 3, type: 'group' }, { _id: 'jkl', parent: 'ghi', main: 'mainID', order: 1, type: 'item' }, { _id: 'mno', parent: 'ghi', main: 'mainID', order: 2, type: 'group' }, { _id: 'pqr', parent: 'mno', main: 'mainID', order: 1, type: 'item' }, { _id: 'stu', parent: 'mainID', main: 'mainID', order: 4, type: 'item' }, { _id: 'abc', parent: 'mainID', main: 'mainID', order: 1, type: 'item' }, { _id: 'def', parent: 'mainID', main: 'mainID', order: 2, type: 'item' }];
    
    console.log(ordered(elements));