如何在“对象”的后代节点上获取键的值

时间:2018-07-16 13:30:20

标签: javascript

为什么我不能总是得到d的值? 我想在更深的对象中获取指定节点的值,该对象可以是字符串,数字或复杂的对象。

var a = {
  a: 1,
  b: {
    c: {
      f: 3
    },
    d: 2
  }
}

function fun(foo, key) {
  for (var f in foo) {
    if (f == key) {
      return foo[f];
    } else {
      fun(foo[f], key)
    }
  }
}
console.log(fun(a, 'd'));

2 个答案:

答案 0 :(得分:0)

如果该密钥存在于您要检查的对象中,请直接将其返回。 否则,浏览每个属性以查看其是否包含该属性。找到值后,立即将其返回。

请注意:如果您有两个具有相同键的嵌套属性,它将仅使您获得第一个。自动发现并非不可思议。

var a = {
  a: 1,
  b: {
    c: {
      f: 3
    },
    d: 2
  }
}

function fun(obj, key) {
  if(obj[key]) return obj[key];
  for (var prop in obj) {
      var result = fun(obj[prop], key);
      if(result) return result;
  }
}
console.log(fun(a, 'd'));

答案 1 :(得分:0)

问题出在您的算法上。当键匹配但函数堆栈没有将该值传播到console.log函数时,它将返回正确的值。

尝试以正确传播值的方式更新函数。一个例子如下:

var a = { a: 1, b: { c: { f: 3 }, d: 2 } }
function fun(foo, key) {
  let x = undefined;
  for (var f in foo) {
    if (f == key) {
      x = foo[f];
    } else {
      x = fun(foo[f], key)
    }
  }
  return x;
}
console.log(fun(a, 'd'));