使嵌套的Javascript对象中的节点自知道它们在对象中的位置

时间:2018-03-13 13:39:07

标签: javascript arrays object recursion nested

我想知道是否有一种很好的方法可以让深层嵌套对象中的节点宣布它们在对象中的位置。

例如,如果你以递归方式抓取下面的示例数据(可能是在Lodash这样的库的帮助下),是否有一个回调函数可以传递给每个记录该位置的节点。

理想情况下,这可以在树中的任何位置工作,而不仅仅是叶节点。

即。 announceLocation(data.b.d[2].j.k[1]) //=> ['b', 'd', '2', 'j', 'k', '1']

let data = {
    a: 1,
    b: {
        c: 2,
        d: [
            {
                e: 3,
                f: 4
            },
            {
                g: [5, 6, 7],
                h: 8,
                i: 9
            },
            {
                j: {
                    k: [10, 11, 12]
                }
            }
        ]
    },
    l: 13
}

更新:

我还没有尝试过,但是npm库js-traverse有一个名为this.path的上下文值,似乎正是我正在寻找的。

2 个答案:

答案 0 :(得分:0)

JavaScript对象没有已定义的顺序,它们(根据定义)是一组未排序的键值对。

但是,如果您想通过某种排序算法对键进行排序,则可以使用以下命令:

const sortedKeys = Object.keys(myObj).sort(sortingFunction);

答案 1 :(得分:0)

您可以将父对象的引用插入子对象。这样你总能找到移动到对象顶部的方法。

let groups = {
  '1': {
    'title': 'Group 1',
    'items': {}
  }
};
let items = [{ 'group_id': '1', 'id': '1', 'title': 'Item 1' }];

for(let item of items){
  item.parent = groups[item.group_id];
  groups[item.group_id].items[item.id] = item;
}


console.log(groups['1'].items['1']); // take a look at the parent property