使用JavaScript中的"地址字符串"从json对象获取字段

Luk*_*e_P 2 javascript json reactjs

我是java脚本的新手,所以如果这是微不足道的话我很抱歉.如果我有一个对象,我的问题是语法:

this.state = {
  A : {
       B: {
           C : [
             {value : 'bob'},
             {value : 'Jim'},
             {value : 'luke'},
           ]
       }
  }
}
Run Code Online (Sandbox Code Playgroud)

我有一个字符串location = 'A.B.C[1]',描述了我想要的数据的位置.

为什么我不能这样做 data = this.state[location].value

是否有一种简单的"JavaScript"方式使用位置字符串获取数据?

任何帮助都会很棒:)

Nin*_*olz 5

您可以拆分路径并减少对象.

function getValue(o, path) {
    return path.replace(/\[/g, '.').replace(/\]/g, '').split('.').reduce(function (o, k) {
        return (o || {})[k];
    }, o);
}

var o = { A : { B: { C: [{ value: 'Brenda' }, { value: 'Jim' }, { value: 'Lucy' }] } }};

console.log(getValue(o, 'A.B.C[1]').value); // Jim
console.log(getValue(o, 'A.B.C[0].value')); // Brenda
console.log(getValue(o, 'Z[0].Y.X[42]'));   // undefined
Run Code Online (Sandbox Code Playgroud)

要设置值,您可以通过遍历给定对象来拆分路径并减少路径.如果不存在对象,请使用名称或数组创建新属性.稍后分配值.

function setValue(object, path, value) {
    var way = path.replace(/\[/g, '.').replace(/\]/g, '').split('.'),
        last = way.pop();

    way.reduce(function (o, k, i, kk) {
        return o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {});
    }, object)[last] = value;
}

var test = {};
setValue(test, "foo.name", "Mr. Foo");
setValue(test, "foo.data[0].bar", 100);
setValue(test, "and.another[2].deep", 20);
console.log(test);
Run Code Online (Sandbox Code Playgroud)