我想编写一个辅助函数来从对象数组中的每个对象中解压缩特定的对象属性。有时这个属性是顶级的,有时它会嵌套任意数量的级别。所以这个问题的症结在于:如何根据可变长度的键名数组访问对象属性?
我希望是这样的:
const func = (arrOfObjects, ...keys) {
return arrOfObjects.map(object => {
return object[keys[0]][keys[1]] ... [keys[N]];
})
}
示例行为:
const input = [
{a: b: {c: 10}},
{a: b: {c: 11}},
{a: b: {c: 12}}
]
console.log(func(input, 'a', 'b', 'c'))
// [10, 11, 12]
console.log(func(input, 'a', 'b'))
// [{c: 10}, {c: 11}, {c : 12}]
我觉得必须有一个很好的 ES6 魔法解决方案,但还没有找到它,所以任何帮助将不胜感激!
干杯,
P
最佳答案
您可以使用 Array#reduce 获得简短而简单的解决方案
const input = [
{a: { b: {c: 10}}},
{a: { b: {c: 11}}},
{a: { b: {c: 12}}}
]
console.log(func(input, ['a', 'b', 'c']))
// [10, 11, 12]
console.log(func(input, ['a', 'b']))
// [{c: 10}, {c: 11}, {c : 12}]
function func(input, props) {
return input.map(x => exctractByProps(x, props));
}
function exctractByProps(obj, props) {
return props.reduce(
(acc, prop) => typeof acc === 'object' && prop in acc ? acc[prop] : undefined,
obj
)
}
主要逻辑是抓取传入的所有属性,然后尝试获取obj[prop[0]][prop[1]][prop[2]]/*对应的值... */[prop[n]]
。如果对象具有与 prop
不匹配的奇怪形状(例如,输入 {a: 1}, ['a', 'b']
或 {d: {c: 1}}, ['a', 'b']
) 然后函数返回 undefined
。
关于javascript - 从键数组访问对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52738206/