【问题标题】:Convert list of Objects when the levels are given in an array当级别在数组中给出时转换对象列表
【发布时间】:2019-05-08 19:39:34
【问题描述】:

假设我有一个数组,它告诉我标签列表和一个值,我需要将它们添加到 JSON 对象中。你是怎么把它变成这样的?

所以基本上我有一个数组和一个值100

arr = ["1", "Male"]

应该把它变成一个对象吧。

obj = {
    "1":{
        "Male":100
        }
    }

【问题讨论】:

  • ['1', 'Male', 'Female']['Female'] 这样的数组会发生什么?然后你会得到{'1': { 'Male': { 'Female': 100 } } }{ 'Female': 100 } 吗?
  • 这是一个更好的副本:stackoverflow.com/questions/34054601/…
  • @Barmar,如果值/对象存在,此目标会为每个级别 amn 对象分配而不检查。
  • @NinaScholz 不确定你的意思。每一层都创建对象,怎么可能不存在?

标签: javascript arrays javascript-objects


【解决方案1】:

您可以为此使用reduceRight。使用value 作为reduce 的initialValue,并在每个循环中创建一个新的嵌套级别。

function createObj(paths, value) { 
  return paths.reduceRight((r, key) =>  ({ [key] : r }), value)  
}

console.log(createObj(["1", "Male"], 100))
console.log(createObj(["level 1", "level 2", "level 3" ], "value"))

【讨论】:

    【解决方案2】:

    您可以保存最后一个属性并减少对象。最后将值分配给最后一个属性。

    此解决方案尊重已给定的属性。

    function setValue(object, path, value) {
       var last = path.pop();
       path.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
    }
    
    var object = {};
    
    setValue(object, ["1", "Male"], 100);
    console.log(object);
    
    setValue(object, ["1", "Female"], 200);
    console.log(object);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 所以我在第一次回答自己时赞成它,但它让我一直忙到我认为它有点过于复杂,并且它不会像它改变一个给定的那样创建一个对象论点,我不确定 OP 是否想要这样。不仅如此,价值的添加方式也有点晦涩难懂(我确实认为这就是你变异而不是创造的原因),所以我很怀疑 :)
    • @Icepickle 此类问题往往会导致以后想要升级该功能应保留所有属性并仅添加一个新属性。虽然这个函数已经在一个空对象上工作了,但还是有一些晦涩难懂的地方。功能很简单,从属性数组中是最后一个存储,对于所有其他存储,减少发生,返回已知属性或向最后一个对象添加新属性。最后一个属性用于赋值。
    • 这是一个很好的假设,我只是在谈论您如何添加最后一个属性,如果您返回对象,您无法做到这一点,所以这样,我发现了一点混淆(可能是一个比模糊更好的词)。唯一的另一件事是我不是变异参数的忠实粉丝,因为这会导致 OP 可能还没有预料到的副作用 :) 我想在某种意义上,你可以创建另一个函数来创建一个新对象,设置值并返回它,那么 OP 有两种方法来解决它
    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多