Javascript 按字符串从对象中提取数据

Javascript 按字符串从对象中提取数据,javascript,Javascript,我有一个目标: var object = {item : {id : "51524512541"}}; 某些服务正在传递此字符串: var str = "item.id"; 我想提取id(51524512541) 按(点)拆分是一个选项,但是对象可能非常深 是否可以使用try-catch进行eval以某种方式提供帮助?您可以使用split将字符串拆分: var splitStr = str.split('.') 然后使用reduce深入对象 const reducer = (accumu

我有一个目标:

var object =  {item : {id : "51524512541"}};
某些服务正在传递此字符串:

var str = "item.id";
我想提取id(51524512541)

(点)拆分是一个选项,但是
对象可能非常深


是否可以使用try-catch进行eval以某种方式提供帮助?

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

var splitStr = str.split('.')
然后使用reduce深入对象

const reducer = (accumulator, index) => accumulator ? accumulator[index] : accumulator
splitStr.reduce(reducer, object)
这应该会给你结果

查看有关减速器的更多信息:

可能更有效的备选方案:

let result = object
for(let str of splitStr) {
  if(!result) break;
  result = result[str]
}
这是一把JS小提琴:


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

var splitStr = str.split('.')
然后使用reduce深入对象

const reducer = (accumulator, index) => accumulator ? accumulator[index] : accumulator
splitStr.reduce(reducer, object)
这应该会给你结果

查看有关减速器的更多信息:

可能更有效的备选方案:

let result = object
for(let str of splitStr) {
  if(!result) break;
  result = result[str]
}
这是一把JS小提琴:


您可以使用
reduce
进行此操作-浏览索引数组并深入研究对象:

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

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

['item', 'id'].reduce((a, i) => a[i], object)
所以你有一系列你想“访问”的索引。现在,您可以对它调用
reduce
——它一个接一个地获取索引,并对每一个索引(
i
)和上一次调用的结果(
a
)调用一个函数,然后返回
a[i]
,因此它在对象中“深入”一层。第一个调用还没有可用的“previous result”,因此它将
对象
作为初始值

所以真正的电话是这样的:

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

您可以使用
reduce
进行此操作-浏览索引数组并深入对象:

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

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

['item', 'id'].reduce((a, i) => a[i], object)
所以你有一系列你想“访问”的索引。现在,您可以对它调用
reduce
——它一个接一个地获取索引,并对每一个索引(
i
)和上一次调用的结果(
a
)调用一个函数,然后返回
a[i]
,因此它在对象中“深入”一层。第一个调用还没有可用的“previous result”,因此它将
对象
作为初始值

所以真正的电话是这样的:

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

reduce
在这里更合适,因为您将数组转换为其他形式。啊,您完全正确,以前从未真正接触过reducer,所以这是一个很好的示例!我将更新我的answer.nice,但由于路径
x.y
和一个空对象
{}
;)而失败类似于
(累加器,索引)=>累加器?累加器[索引]:累加器
要解决此问题,我将使用
对…of。您可以尽早从循环中中断。
reduce
在这里更合适,因为您将数组转换为elseYeah,您完全正确,以前从未真正接触过reducer,所以这是一个很好的示例!我将更新我的answer.nice,但由于路径
x.y
和一个空对象
{}
;)而失败类似于
(累加器,索引)=>累加器?累加器[索引]:累加器
要解决此问题,我将使用对…of。您可以尽早从循环中中断。请尝试
如果对象嵌套得很深,并且设置了奇怪的关键帧,或者混合使用了数组,则可以使用规范化的解决方案。像lodash的
获取
或提供的解决方案之一。@marzelin jinx!try
的可能重复。get
如果对象嵌套得很深,并且设置了奇怪的关键帧,或者混合了数组,则可能需要一个规范化的解决方案。像lodash的
获取
或提供的解决方案之一。@marzelin jinx!@Shazam:See@MichaelCurry的fiddle-
res
包含结果值(不是
object[res]
)。@Shazam:See@MichaelCurry的fiddle-
res
包含结果值(不是
object[res]
)。