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

时间:2019-06-13 02:38:05

标签: javascript function object ecmascript-6

我有以下对象:

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

谢谢!

3 个答案:

答案 0 :(得分:3)

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

答案 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');
}
相关问题