【问题标题】:How can I programmatically add to a variably-nested object?如何以编程方式添加到可变嵌套对象?
【发布时间】:2023-03-09 10:22:01
【问题描述】:

我需要一种将一个对象添加到另一个对象中的方法。通常这很简单,只需

obj[property] = {'name': bob, 'height': tall}

但是有问题的对象是嵌套的,因此需要以下内容:

obj[prop1][prop2] = {'name': bob, 'height': tall}

关键在于嵌套是可变的。那就是我不知道每个新对象在运行前嵌套的深度。 基本上我将生成一个字符串,它代表一个对象路径,如

“object.secondObj.thirdObj.fourthObj”

然后我需要在第四个对象内部设置数据,但是我不能使用括号[]方法,因为我事先不知道需要多少个括号。有没有办法做到这一点? 如果有必要,我也在使用 jQuery。

【问题讨论】:

标签: javascript object variable-assignment


【解决方案1】:

当然,您可以使用递归或简单迭代。我更喜欢递归。以下示例旨在进行概念验证,可能不应在生产中使用。

var setDeepValue = function(obj, path, value) {
    if (path.indexOf('.') === -1) {
        obj[path] = value;
        return;
    }

    var dotIndex = path.indexOf('.');
    obj = obj[path.substr(0, dotIndex)];

    return setDeepValue(obj, path.substr(dotIndex + 1), value);
};

但递归不是必需的,因为在 JavaScript 中您可以只更改引用。

var objPath = 'secondObj.thirdobj.fourthObj';
var valueToAdd = 'woot';

var topLevelObj = {};
var attributes = objPath.split('.');
var curObj = topLevelObj;

for (var i = 0; i < attributes.length; i++) {
    var attr = attributes[i];
    if (typeof curObj[attr] === 'undefined') {
        curObj[attr] = {};
    }

    curObj = curObj[attr];

    if (i === (attributes.length - 1)) {
        // We're at the end - set the value!
        curObj['awesomeAttribute'] = valueToAdd;
    }
}

【讨论】:

  • 谢谢!这完美无缺。我已经有一段时间反对这个了:)
【解决方案2】:

而不是生成一个字符串...

var o="object";
//code
o+=".secondObj";
//code
o+=".thirdObj";
//code
o+=".fourthObj";

...你可以这样做

var o=object;
//code
o=o.secondObj;
//code
o=o.thirdObj;
//code
o=o.fourthObj;

然后你可以像这样添加数据:

o.myprop='myvalue';

object 将随着更改而更新。

在这里查看:http://jsfiddle.net/rFuyG/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多