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]
)。