如何使用javascript将列表转换为递归字典?

时间:2018-04-10 15:35:49

标签: javascript dictionary recursion

我有包含有序键的列表:

list

我想使用dict = { "0": { "0": { "0": { "1": {} } } } } 创建一个递归字典,如下所示:

originalTable.Clone()

由于列表的长度从1到1不等,我很难理解我是如何实现的,因为我不明白如何使用Javascript在彼此内部分配多个密钥。

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

您可以巧妙地将Array.prototype.reduce与简单的属性赋值

一起使用

const dict = {}
const list = ['0', '0', '0', '1']

list.reduce((obj, key) => obj[key] = {}, dict);

console.log (dict)
// {"0":{"0":{"0":{"1":{}}}}}

这基本上是循环遍历所有键并使用累加器来存储树中当前位置的简短版本:

  let acc = dict;

  for(const key of list) {
    acc = acc[key] = {};
  }

答案 1 :(得分:2)

Array.forEach()与一个指向树中当前位置的变量一起使用:

var dict = {};
var list = ['0', '0', '0', '1'];
var current = dict;
list.forEach(function(k, i) {
  current = current[k] = {};
});

console.log(dict);

另一个选项是Array.reduceRight()向后迭代list,构建顶级,将结果分配到较低级别,依此类推......

const list = ['0', '0', '0', '1'];

const dict = list.reduceRight((r, k) => ({ [k]: r }), {});

console.log(dict);

答案 2 :(得分:2)

看起来你来自Python。 JavaScript没有像Python这样的字典(dict)而是有对象。 Python提供的一些操作使得使用动态密钥变得容易,但在JavaScript中可能更难。在我们知道您正在做什么之前,很难再为您提供建议。

无论如何,你可以通过一个简单的递归函数来实现你的目标



const Empty =
  Symbol ()

const toDict = ([ first = Empty, ...rest ]) =>
  first === Empty
    ? {}
    : { [first] : toDict (rest) }

console.log (toDict (['0', '0', '0', '1']))
// {
//   "0": {
//     "0": {
//       "0": {
//         "1": {}
//       }
//     }
//   }
// }




答案 3 :(得分:0)

您可以创建递归函数,该函数将循环数组并向对象添加属性,直到数组结束。



var dict = {};
var list = ['0', '0', '0', '1'];

const f = (o, a, n = 0) => a[n] && f(o[a[n]] = {}, a, n+1)
 
f(dict, list)
console.log(dict)