如何使用字符串访问嵌套对象值,以便我可以编辑?

时间:2018-05-29 16:19:07

标签: javascript

如果我有以下字符串或数组:

var thestring = '[0]["more"][0]["more"][0]["text"]';
var thearray = ['0','more','0','more','0','text'];

如何使用该字符串或数组来识别对象的一部分,以便对其进行编辑?

var theobject = [
    {
        "id":1,
        "text":"hello",
        "more": [
            {
                "id":2,
                "text":"hello",
                "more":[
                    {
                        "id":3,
                        "text":"hello", // I want to edit this
                        "more": [
                            {
                                "id":4,
                                "text":"hello",
                                "more":[
                                ]
                            }
                        ]
                    }
                ]
            }
         ]
    },
    {
        "id":5,
        "text":"hello"
    },
    {
        "id":6,
        "text":"hello"
    },
    {
        "id":7,
        "text":"hello"
    }
];

基本上我正试图访问该对象的这一部分:

theobject[0]["more"][0]["more"][0]["text"];

但是如果我用字符串做它就不起作用:

theobject[thestring];

2 个答案:

答案 0 :(得分:2)

查看lodash _.get和_.set函数,它们允许您使用路径类型语法访问对象,例如:

_.get(object, 'property1.property2.property3', defaultValue);

存在等效的_.set函数,它们都很有用。

https://lodash.com/docs#get

https://lodash.com/docs#set

来自lodash docs:

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');

_.get(object, ['a', '0', 'b', 'c']);

_.get(object, 'a.b.c', 'default');

提供默认对象的能力也很不错,它使访问深度对象的对象非常容易。

Set以类似的方式工作:

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.set(object, 'a[0].b.c', 4);
console.log(object.a[0].b.c);
// => 4

_.set(object, ['x', '0', 'y', 'z'], 5);
console.log(object.x[0].y.z);
// => 5

答案 1 :(得分:2)

如果您需要它而没有依赖项,此函数将更新thearray

描述的值
function setObjectValue(o, a, v) {
    a = a.slice(); // copy array
    p = a.pop(); // get last value for updating
    a.forEach(function(p) { o = o[p]; }); // traverse object for each property in a
    o[p] = v; // update the final value
}

用法:setObjectValue(theobject, thearray, 'UPDATED')