在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: {}
}
}
}
以此类推
我想做的是:
- 实例化一个空对象,Dictionary
- 取长度为n的任意数组
- 迭代数组,这样在数组位置 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>
我觉得自己有点傻,但我正在努力寻找解决方案。
我有一组数组,我需要使用它们来构建一个 JSON-ish 对象。
例如
[a]
[a, b]
[a, b, c]
[a, b, d]
[e]
[e, f]
[e, f, g]
变成
{
a: {
b: {
c: {}
d: {}
}
}
e: {
f: {
g: {}
}
}
}
以此类推
我想做的是:
- 实例化一个空对象,Dictionary
- 取长度为n的任意数组
- 迭代数组,这样在数组位置 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>