更新:尽管下面的答案提供了很好的代码价值,但此问题的改进版本及其答案可以在此处找到。
编辑:更正示例数据对象并简化(希望)问题描述
目标:给定以下对象,函数应该遍历所有嵌套的对象并返回与keypath字符串参数相对应的值,该参数可能是一个简单的字符串,也可能包括方括号/点符号表示法。解决方案应在Angular中工作(纯JavaScript、TypeScript或适用于Angular的库)。
我的对象:
const response = {
"id": "0",
"version": "0.1",
"interests": [ {
"categories": ["baseball", "football"],
"refreshments": {
"drinks": ["beer", "soft drink"],
}
}, {
"categories": ["movies", "books"],
"refreshments": {
"drinks": ["coffee", "tea"]
}
} ],
"goals": [ {
"maxCalories": {
"drinks": "350",
"pizza": "700",
}
} ],
}
最初的函数是:
function getValues(name, row) {
return name
.replace(/\]/g, '')
.split('[')
.map(item => item.split('.'))
.reduce((arr, next) => [...arr, ...next], [])
.reduce ((obj, key) => obj && obj[key], row);
}
所以,如果我们运行getValues("interests[refreshments][drinks]", response);
函数,它应该返回一个包含所有适用值的数组:["beer", "soft drink", "coffee", "tea"]。
对于简单的字符串键,上述方法运行良好。使用getRowValue("version", response)
将像预期的那样返回"0.1"。但是,getRowValue("interests[refreshments][drinks]", response)
返回undefined
。
我查阅了此文以及相关链接,但难以理解如何处理这个对象的复杂性。
ID 映射到 "id"
,类别 > "interests.categories"(数组)
,饮料 > "interests.refreshments.drinks"(嵌套在对象中的数组)
,饮料卡路里 > "goals.maxCalories.drinks"(嵌套在对象中的对象中的数组)
和披萨卡路里 > "goals.maxCalories.pizza"(如上所述)
。 - Joe H.let response = { "id": "0", "version": "0.1", "interests": [ { "categories": ["baseball", "football"], "refreshments": { "drinks": ["beer", "soft drink"], } }, { "categories": ["movies", "books"], "refreshments": { "drinks": ["coffee", "tea"] } } ], "goals": [ { "maxCalories": { "drinks": "350", "pizza": "700", } } ], }
- Joe H.