我有以下对象:
let a = {
aa: {
aaa: 1
},
ab: {
aba: {
abaa: 2
}
}
}
我想编写一个函数,您可以向其传递一个对象以及任意数量的表示该对象中嵌套属性的字符串,并让该函数输出相应的值。例如:
func(a, 'aa', 'aaa') // 1
func(a, 'ab', 'aba', 'abaa') // 2
如果参数数量固定,我就能做到这一点,就像这样:
function func() {
console.log(arguments[0][arguments[1]][arguments[2]])
}
有人知道我怎么写func()
,以便它可以接受任意数量的参数吗?
谢谢!
答案 0 :(得分:3)
将reduce
与arguments
一起使用:
let a = {
aa: {
aaa: 1
},
ab: {
aba: {
abaa: 2
}
}
}
function func() {
console.log([...arguments].reduce((a, c) => a[c]));
}
func(a, 'aa', 'aaa');
func(a, 'ab', 'aba', 'abaa');
如果您不喜欢使用arguments
,请休息并散布...
:
let a = {
aa: {
aaa: 1
},
ab: {
aba: {
abaa: 2
}
}
}
function func(...args) {
console.log(args.reduce((a, c) => a[c]));
}
func(a, 'aa', 'aaa');
func(a, 'ab', 'aba', 'abaa');
答案 1 :(得分:2)
根据arguments
的长度对其进行循环:
function func() {
var obj = arguments[0];
for(var i = 1; i < arguments.length; ++i) {
obj = obj[arguments[i]];
}
return obj;
}
或者,如果您使用的是现代JavaScript,则可以改为以下方式:
function func(obj, ...keys) {
keys.forEach(key => obj = obj[key]);
return obj;
}
答案 2 :(得分:1)
使用es6 destructuring assignment
处理任意数量的参数很方便function logNestProperties(obj, ...args) {
let value = args.reduce((acc, cur) => acc[cur], obj);
console.log(value || 'illegal properties');
}