【问题标题】:JS function that logs properties of nested objects, where properties are passed as parameters记录嵌套对象属性的 JS 函数,其中属性作为参数传递
【发布时间】:2019-10-27 14:02:33
【问题描述】:

我有以下对象:

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

【问题讨论】:

    标签: javascript function object ecmascript-6


    【解决方案1】:

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

    【讨论】:

    • 谢谢!这确实有效,我很感激。我将给 Joseph Sible 的回答打上绿色检查,因为它首先出现,但您的解决方案也是我一直在寻找的。​​span>
    • 我实际上比我自己更喜欢这个答案。
    • 感谢@JosephSible,很高兴认识喜欢我回答的人。
    【解决方案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;
    }
    

    【讨论】:

      【解决方案3】:

      用 es6 destructuring assignment 处理任意数量的参数很方便

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

      【讨论】:

        猜你喜欢
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多