记录嵌套对象的属性的 JS 函数,其中属性作为参数传递



我有以下对象:

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()以便它接受任意数量的参数?

reducearguments一起使用:

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');

根据长度循环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;
}

使用 es6 解构赋值处理任意数量的参数很方便

function logNestProperties(obj, ...args) {
let value = args.reduce((acc, cur) => acc[cur], obj);
console.log(value || 'illegal properties');
}