【问题标题】:javascript object - Dynamically setting a nested value using recursive functionjavascript object - 使用递归函数动态设置嵌套值
【发布时间】:2015-05-19 06:29:11
【问题描述】:

我正在尝试设置嵌套子对象属性之一,但嵌套级别是动态的。

如何动态设置嵌套属性?

它只工作一个级别的属性,我无法设置下一个内部级别....

我的代码:

function deSerialize(qualifiedNameArray, currentIndex, resultJSON, valueToBeInitializedForFinalNode)
{
    if (currentIndex  == (qualifiedNameArray.length - 1)){
        resultJSON [qualifiedNameArray[currentIndex++]] = valueToBeInitializedForFinalNode;
    }
    else
    {
        resultJSON [qualifiedNameArray[currentIndex++]] = {};
    }

    if (currentIndex < qualifiedNameArray.length)
        deSerialize( qualifiedNameArray, currentIndex, resultJSON, valueToBeInitializedForFinalNode);

    return resultJSON;
}


  var results = {"columnname":"person.name.first", "varcharvalue":"david", "objecttype" : "user"};
    var valueToBeInitializedForFinalNode = results["varcharvalue"];
    var qualifiedNameArray = results["columnname"].split('.');
    var resultJSON = {};
    deSerialize(qualifiedNameArray, 0, resultJSON, valueToBeInitializedForFinalNode);

【问题讨论】:

  • 那么,简而言之,如果你有一个路径,你想在一个对象中将该路径设置为那个值吗?我不确定你想用 currentIndex 做什么。你想序列化一个对象数组吗?

标签: javascript javascript-objects


【解决方案1】:

一个简单的解决方案可能是,不确定这是否是您正在寻找的:

function makeObj(arry, initValue){
    var obj = {}, objRef  = obj, idx = 0;    
    while(idx < arry.length -1){
        obj[arry[idx]] = {};
        obj = obj[arry[idx]];
        idx++;
    }
    obj[arry[idx]] = initValue;
    return objRef;
}

用法:

resultJSON = makeObj( qualifiedNameArray, valueToBeInitializedForFinalNode);

另一种方法是:

function makeObj(objRef, arry, initValue){
    var obj = objRef, idx = 0;    
    while(idx < arry.length -1){
        if(!obj[arry[idx]]) obj[arry[idx]] = {};
        obj = obj[arry[idx]];
        idx++;
    }
    if(!obj[arry[idx]]) obj[arry[idx]] = initValue;
}

这样,您不会更改任何可能已经存在的值,用法:

makeObj( resultJSON, qualifiedNameArray, valueToBeInitializedForFinalNode);

【讨论】:

  • 嗨,它只能工作 3 级对象......如果我再添加一个内部对象不起作用............示例............var结果 = {“列名”:“person.name.deepak.samuel”,“varcharvalue”:“david”,“objecttype”:“user”};结果是:{人:{名称:{deepak:[对象]}}}
  • @user3374541 你是如何检查值的?
  • 使用console.log(resultJSON);
  • 尝试使用console.log(resultJSON.person.name.deepak); 进行检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 2020-07-15
  • 2021-11-23
相关资源
最近更新 更多