【问题标题】:Create Dynamically Nested Objects with loops使用循环创建动态嵌套对象
【发布时间】:2019-07-10 15:58:19
【问题描述】:

我想动态创建一个嵌套对象。我可以硬编码创建它。是否可以通过循环来做到这一点?

result = {}
keys = ["a", "b", "c", "d"]

result[keys[0]] = {}
result[keys[0]][keys[1]] = {}
result[keys[0]][keys[1]][keys[2]] = {}
result[keys[0]][keys[1]][keys[2]][keys[3]] = "cool"

我想传递一个整数,例如如果它是“3”,这应该创建一个像这样的对象:

result = {
  "a": {
     "b": {
        "c": "cool"
     }
   }
}

如果是4,:

result = {
  "a": {
     "b": {
        "c": {
           "d": "cool"
        }
     }
   }
}

等等……

编辑:

我也在检查结果对象,以创建这个嵌套结构。如果还没有任何字段,我只需创建对象。

使用此结构对数据进行分组。 有机会动态检查这些吗?

if (!result[keys[0]]) 
if (!result[keys[0]][keys[1]]) 
if (!result[keys[0]][keys[1]][keys[2]]) 

【问题讨论】:

  • keys 是否包含正确数量的输入(如果输入为 5)?
  • 您可以使用递归来做到这一点,并将迭代的索引与其字母表示映射。
  • @depperm 获取密钥作为此函数的参数。将来可能会改变。这就是为什么我正在寻找动态解决方案。您基本上可以使用 keys.length 来确定。
  • 你有什么问题?你问如何在javascript中使用for循环?
  • @appleapple 是的,

标签: javascript loops object


【解决方案1】:

您可以为此使用reduceRight()。它只是从键列表中最后一项的内部开始,并以“cool”开头:

let keys = ["a", "b", "c", "d"]
let limit = 3

let result = keys.reduceRight((obj, key) => ({[key]: obj}), "cool")

console.log(result)

要限制对象停止的位置,您可以遍历键的一部分。例如:

let keys = ["a", "b", "c", "d"]
let start = 0
let stop = 3 // slices are don't inlcude the last item, so this will stop at index 2

let result = keys.slice(start, stop).reduceRight((obj, key) => ({
  [key]: obj
}), "cool")

console.log(result)

【讨论】:

  • OP 说他想传递一个整数,所以你的键可能是 -> Array(3).fill().map((f, ix) => String.fromCharCode(97 + ix)).reduceRight(....
  • reduceRight函数?!哦,好吧,是时候进行一些重构了。 “我想传递一个整数,例如如果它是“3”,这应该创建一个像[对象三层深]这样的对象。”可能需要在reduce之前添加一个slice
  • 完美!任何机会在范围内使用它。比如以索引 1 ("b") 开始并以索引 2 ("c") 结束
  • 谢谢@Keith,我错过了那部分。
  • @MarkMeyer 太棒了,你帮了大忙!非常感谢。
【解决方案2】:

简单的for循环解决方案。

let result = {}
let keys = ["a", "b", "c", "d"]
let depth=3;

let current = result
for(let i=0;i<depth;++i){
  let key = keys[i]
  if(i == depth-1) current[key] = 'cool'
  else current = current[key] = {}

}

console.log(result)

【讨论】:

    【解决方案3】:

    如果您想添加到给定对象的新属性,您可以减少对象的键,并为未给定的键采用默认对象。最后赋值。

    function setValue(object, path, value, limit) {
        var keys = path.slice(0, limit),
            last = keys.pop();
    
        keys.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
        return object;
    }
    
    var result = { foo: 42 },
        keys = ["a", "b", "c", "d"];
    
    setValue(result, keys, 'cool');
    console.log(result);
    
    setValue(result, keys, 'cool', 3);
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案4】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-28
        • 2016-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多