通过字符串从对象中提取数据

时间:2018-09-12 14:07:44

标签: javascript

我有这个对象:

var object =  {item : {id : "51524512541"}};

某些服务正在传递此字符串:

var str = "item.id";

我想提取ID(51524512541)。

.(点)分隔是一种选择,但是object可能很深。

也许在尝试捕获方面可以在某种程度上有所帮助吗?

2 个答案:

答案 0 :(得分:3)

您可以为此使用reduce-遍历索引数组并更深入地研究对象:

str.split('.').reduce((a, i) => a[i], object)

说明:

首先,str被分成数组,形成:

['item', 'id'].reduce((a, i) => a[i], object)

因此,您有要“访问”的索引数组。现在,您在其上调用reduce-它逐个获取索引,并在每个索引上调用一个函数(i)和上一次调用的结果(a)并返回a[i],因此它可以“深入”对象的更深一层。第一次调用尚无“先前的结果”,因此它将object作为初始值。

所以真正的通话看起来像这样:

i = 'item', a = {"item":{"id":123}} -> result a[i] is {"id":123}
i = 'id', a = {"id":123} -> result a[i] is 123

答案 1 :(得分:1)

您可以使用split拆分字符串:

var splitStr = str.split('.')

然后使用reduce进入对象。

const reducer = (accumulator, index) => accumulator ? accumulator[index] : accumulator
splitStr.reduce(reducer, object)

这应该给你结果。

在此处查看有关减速器的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

替代选项,可能更有效:

let result = object
for(let str of splitStr) {
  if(!result) break;
  result = result[str]
}

这是一个JS小提琴:

http://jsfiddle.net/h75dxsrz/15/