javascript - 从键数组访问对象的属性

标签 javascript algorithm ecmascript-6

我想编写一个辅助函数来从对象数组中的每个对象中解压缩特定的对象属性。有时这个属性是顶级的,有时它会嵌套任意数量的级别。所以这个问题的症结在于:如何根据可变长度的键名数组访问对象属性?

我希望是这样的:

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/

相关文章:

javascript - 用 JavaScript 写一个更好的 IF return 语句

javascript - 为什么 import 关键字有用?

javascript - 错误: Cannot set property 'src' of null

algorithm - 为什么日历转换库围绕儒略日?

python - 计算 N 的因式分解中有多少个不同的素数

ruby-on-rails - 将 es6 与 rails Assets 管道一起使用的最佳方法是什么

javascript - React-native:我如何将参数传递给 Stacknavigator 组件

javascript - Forloop困惑

javascript - setTimeout 中 let 和 var 的区别?

javascript - JS : this. 构造函数简写(从非静态调用静态方法)