我有这个对象:
var object = {item : {id : "51524512541"}};
某些服务正在传递此字符串:
var str = "item.id";
我想提取ID(51524512541)。
以.
(点)分隔是一种选择,但是object
可能很深。
也许在尝试捕获方面可以在某种程度上有所帮助吗?
答案 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小提琴: