2017-02-13 40 views
2

我是java脚本的新手,所以如果这很琐碎,我很抱歉。 我的问题是语法,如果我有一个对象:使用JavaScript中的“地址字符串”从json对象获取字段

this.state = { 
    A : { 
     B: { 
      C : [ 
      {value : 'bob'}, 
      {value : 'Jim'}, 
      {value : 'luke'}, 
      ] 
     } 
    } 
} 

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

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

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

任何帮助将是惊人的:)

+0

有对于没有内置工具。我见过的用于这个问题的一个术语是“对象图导航”。网站上至少有一个重复的问题,但很难找到。 – Pointy

+0

字符串是如何生成的?这可能是一个问题XY – charlietfl

+0

使用正则表达式您所在的位置来获取所有级别 – Weedoze

回答

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

为了设置一个值,你可以分割的路径和步行给定对象减少的路径。如果不存在对象,则使用该名称或数组创建一个新属性。稍后分配值。

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);

+0

正在尝试做类似的事情,但是,阵列搞砸了。解决方案是否可以在任何级别的数组上使用?即“A.B [0] .c” –

+0

它适用于任何级别。如果路径不可解析,则返回'undefined'。 –

+0

太棒了,这是某种巫术,这完美的作品。另一个简单的问题你有没有设定数据(即使该字段未定义)相似的方法,如:'的setValue(对象,路径值)'? :) –