返回深度属性的值(如果存在)

时间:2014-02-19 03:41:09

标签: javascript function object return

我编写了这个函数来搜索并返回对象中深层属性的值,并且想知道是否有一种方法可以使用递归或类似的东西来使函数执行相同的操作,但代码更少(和可能会删除最多可以测试的五个属性的限制。)

如果函数存在,函数将返回深属性值,否则返回undefined。

function getDeep(o, p2, p3, p4, p5) {
    if (p5 !== undefined) {
        if (o.hasOwnProperty(p2) && o[p2].hasOwnProperty(p3) && o[p2][p3].hasOwnProperty(p4) && o[p2][p3][p4].hasOwnProperty(p5)) {
            return o[p2][p3][p4][p5];
        }
    } else if (p4 !== undefined) {
        if (o.hasOwnProperty(p2) && o[p2].hasOwnProperty(p3) && o[p2][p3].hasOwnProperty(p4)) {
            return o[p2][p3][p4];
        }
    } else if (p3 !== undefined) {
        if (o.hasOwnProperty(p2) && o[p2].hasOwnProperty(p3)) {
            return o[p2][p3];
        }
    } else if (p2 !== undefined) {
        if (o.hasOwnProperty(p2)) {
            return o[p2];
        }
    } else if (o !== undefined) {
        return o;
    }
}
window.onload = function () {
    var obj = {a:{b:{c:1}}};
    window.console.log(getDeep(obj, 'a', 'b', 'c')); // returns 1;
    window.console.log(getDeep(obj, 'a', 'b', 'd')); // returns undefined;
}

3 个答案:

答案 0 :(得分:1)

.reduce对此非常有用。

演示: http://jsfiddle.net/NU4vF/2

function getDeep() {
    return [].reduce.call(arguments, function(obj, prop) {
        return obj && obj[prop];
    });
}

答案 1 :(得分:0)

使用下划线/ lodash,您可以使用

获得深层属性
_.get(obj, 'a.b.c'); //returns 1
_.get(obj, 'a.b.d'); //returns undefined

并使用第三个参数指定默认返回值:

_.get(obj, 'a.b.c', null); //returns 1
_.get(obj, 'a.b.d', null); //returns null

答案 2 :(得分:0)

以下功能将允许完整或部分应用程序,并将考虑阵列访问。它还与不支持ES5功能的旧浏览器兼容。

演示https://tonicdev.com/wilmoore/576587d46ea8b6140097eb1e

function get(path) {
  function _get(source) {
    var end = path.length;
    var idx = -1;
    var ref = source;

    while (++idx < end) {
      if (!ref) break;
      ref = ref[path[idx]];
    }

    return ref;
  }

  return (arguments.length > 1)
    ? _get(arguments[1])
    : _get.bind(null)
}