Javascript 从键数组访问对象上的属性

Javascript 从键数组访问对象上的属性,javascript,algorithm,ecmascript-6,Javascript,Algorithm,Ecmascript 6,我想编写一个helper函数,从对象数组中的每个对象解包一个特定的对象属性。有时此属性将是顶级的,有时它将嵌套任意数量的级别。因此,这个问题的关键是:如何基于长度可变的键名数组访问对象属性 我希望有这样的东西: const func = (arrOfObjects, ...keys) { return arrOfObjects.map(object => { return object[keys[0]][keys[1]] ... [keys[N]]; })

我想编写一个helper函数,从对象数组中的每个对象解包一个特定的对象属性。有时此属性将是顶级的,有时它将嵌套任意数量的级别。因此,这个问题的关键是:如何基于长度可变的键名数组访问对象属性

我希望有这样的东西:

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

如果提供类似于
[a,b,c[0],name]的访问器,则可以编写一个自定义函数,如果在嵌套对象中找到该值,则返回该值,否则返回未定义的值

让obj={
答:1,,
b:2,
c:{
d:1,
e:[{
f:3,
g:[{
z:45
}]
}]
}
}
函数findKeyFromPattern(obj,patternArr){
设值=obj;
for(设i=0;ilog(findKeyFromPattern(obj,['c','e[1]','g'])
您可以使用

const输入=[
{a:{b:{c:10}},
{a:{b:{c:11}},
{a:{b:{c:12}}
]
log(func(输入,['a','b','c']))
// [10, 11, 12]
log(func(输入,['a','b']))
//[{c:10},{c:11},{c:12}]
功能func(输入、道具){
返回input.map(x=>extractbyprops(x,props));
}
功能EXTRACTBYPROPS(obj,props){
返回道具。减少(
(acc,prop)=>typeof acc===“对象”和acc中的prop?acc[prop]:未定义,
obj
)

}
基于您对我的问题和示例的回答。似乎输入的顺序总是与对象嵌套相匹配。因此,我的解决方案如下:

const func=(arrOfObjects,…keys)=>{
返回arrOfObjects.map(对象=>{
设obj=object,integer=keys.length;
for(让索引=0;索引<整数;索引++){
obj=obj[键[索引];
如果(obj==未定义)中断;
}
返回obj;
});
};
常量输入=[
{a:{b:{c:10}},
{a:{b:{c:11}},
{a:{b:{c:12}}
];
日志(func(输入“a”、“b”、“c”);
// [10, 11, 12]
日志(func(输入“a”、“b”);

//[{c:10},{c:11},{c:12}]
我将创建一个递归函数。但是,输入是数组还是对象?很明显,你正在映射一个对象数组,尽管这个问题暗示了一个来自一个键数组的“对象”。啊,我这么说是因为我认为这是问题的技术关键。在地图中,我希望访问基于键数组的对象属性。我会尽量弄清楚的。这个问题对我来说不是很清楚。请你澄清一下你想用一个例子做什么,在这个例子中你写出了你期望从一个例子
输入中得到的
输出
?乍一看,我还将介绍一个递归函数,该函数遍历对象/数组,直到它到达您正在搜索的对象。但是您正在搜索对象中的键或它们各自的值吗?已再次编辑,希望现在更清晰。@Batters
输入中的所有对象将具有相同的形状?关于形状,我的意思是,它们是否都具有相同的嵌套级别,或者可以不同?
value=value[arrmatch[1]]| |未定义这真的需要吗?如果
值[arrmatch[1]
返回
未定义
则OR是完全多余的。如果它返回一个错误的值,如
0
,它将变为
undefined
value=undefined;返回返回
将返回未定义的
。为什么要将
value
设置为这个值,而这在下一行中并不重要?@vlaz,感谢你指出了一些基本缺陷,上面的不是一个完美的解决方案,我仍在努力完善它。它指出了一种方法,尽管
findKeyFromPattern({a:1},[“a”])
工作并返回预期值,但
findKeyFromPattern({a:1,b:{c:2},[“c”])
返回
未定义的
。如果将
[“b.c”]
作为第二个参数传递,则相同。老实说,我在阅读和理解函数时遇到困难,所以我开始用一些输入来戳它。哦,我得到了
findKeyFromPattern({a:1,b:{c:2},[“b”,“c”])
工作。传递与对象不匹配的属性可能会破坏函数-例如,如果你使用
func(输入,“b”,“c”)
这正是我要说的,但请查看他问题下方的评论。用例是明确定义的。欧元:添加了一个中断,如果输入错误,将返回未定义。我接受了一个答案,但这似乎也正是我想要的,谢谢。现在我明白了,reduce对于这个应用程序来说完全有意义