如何通过一组键来获取对象的值

4

我有一个下面看到的 obj:

var obj = {
  a: {
    b:{
      c:"c"
    }
  }
}

我希望获得以下数值:
var t = ["a", "b", "c"]  // give a key list

console.log(obj["a"]["b"]["c"])  // and get value like this.

详细来说,我希望将需求封装在一个函数中:

function get_value(obj, key_list) {

}

因为key_list不确定,所以如何实现该功能?
2个回答

3
只需要使用一个while循环并迭代键即可。

var obj = {
  a: {
    b:{
      c:"c"
    }
  }
}
var t = ["a", "b", "c"];
function get_value(obj, key_list) {
  let currentReference = obj;
  while (key_list.length !== 0) {
    currentReference = currentReference[key_list[0]];
    key_list = key_list.slice(1);
  }
  return currentReference;
}
console.log(get_value(obj, t));

不过用 reduce 会更优雅:

var obj = {
  a: {
    b:{
      c:"c"
    }
  }
}
var t = ["a", "b", "c"];
function get_value(obj, key_list) {
  return key_list.reduce((currentReference, key) => currentReference[key], obj);
}
console.log(get_value(obj, t));


我认为数组中键的顺序很重要。例如,如果键“b”和“c”的位置互换,那么就会出现问题。 - brk
那个减少解决方案看起来相当不错。 - Isaac

2

递归解决方案:

function get_value(obj, key_list, i) {
  if (i == undefined) {
    i = 0;
  }
  if (i < key_list.length - 1) {
    return get_value(obj[key_list[i]], key_list, i+1)
  }
  return obj[key_list[i]]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接