在JavaScript中,从一组数组递归构建字典/嵌套对象

In JavaScript, recursively build a dictionary / nested object from a set of arrays

我觉得自己有点傻,但我正在努力寻找解决方案。

我有一组数组,我需要使用它们来构建一个 JSON-ish 对象。

例如

[a]
[a, b]
[a, b, c]
[a, b, d]
[e]
[e, f]
[e, f, g]

变成

{
  a: {
    b: {
      c: {}
      d: {}
    }
  }
  e: {
    f: {
      g: {}
    }
  }
}

以此类推

我想做的是:

  1. 实例化一个空对象,Dictionary
  2. 取长度为n的任意数组
  3. 迭代数组,这样在数组位置 i,如果 Dictionary 在 Dictionary[Array[0]]...[Array[i]] 处没有 属性,我定义属性 作为数组[i]:{}

我遇到的问题是查看指向相关 属性 的任意路径。我不知道如何为我正在寻找的 属性 名称构建多级路径。即,当 i === 0 时,

var check = Array[i];
typeof Dictionary[check] === 'undefined';

我们将获得预期的行为。但它显然会将整个数组构建为一组平面对象属性(而不是嵌套字典)。

然后我没有办法将下一步添加到 check 变量 --

...
check = check[Array[i+1];

check = Dictionary[check][Array[i+1]]

进一步的排列将不起作用。

我敢肯定我在这里遗漏了一些愚蠢的东西,但我一直坚持下去,如果有人有它,我将不胜感激。

而且,请注意,如果可能的话,我只需要使用 jQuery 或 lodash 来执行此操作,如果它在普通 JS 中无法合理实现的话。

简单:

lst = [
    ['a'],
    ['a', 'b'],
    ['a', 'b', 'c'],
    ['a', 'b', 'd'],
    ['e'],
    ['e', 'f'],
    ['e', 'f', 'g']
];


tree = {};
lst.forEach(function(item) {
    item.reduce(function(node, chr) {
        return node[chr] || (node[chr] = {});
    }, tree);
});

document.write("<pre>" + JSON.stringify(tree, 0, 3))

你有一个更简洁的答案,但我已经写好了...

var arrs = [
    ['a'],
    ['a', 'b'],
    ['a', 'b', 'c'],
    ['a', 'b', 'd'],
    ['e'],
    ['e', 'f'],
    ['e', 'f', 'g'],
    ['e', 'f', 'g', 'h', 'i'],
    ['e', 'f', 'g', 'h', 'j']
];

var dictionary = {};

arrs.forEach(function (item) {
    addArray(dictionary, item);
});

document.getElementById("output").innerText = JSON.stringify(dictionary, null, 3);

function addArray(dic, arr) {
    arr.forEach(function (item) {
        dic = addNode(dic, item);
    });
    return dic;
}

function addNode(node, item) {
    return node[item] || (node[item] = {});
}
<pre id="output"></pre>