【问题标题】:Returning the value of deep properties if they exist如果存在,则返回深层属性的值
【发布时间】:2014-03-19 04:43:18
【问题描述】:

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

如果存在,该函数将返回一个深度属性值,否则返回未定义。

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;
}

【问题讨论】:

    标签: javascript function object return


    【解决方案1】:

    .reduce 对此很有用。

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

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

    【讨论】:

    • 是的,刚刚发现。谢谢。 :-)
    • 非常好。似乎适用于我迄今为止测试过的所有情况。出色的工作,而且它迫使我学习一些新概念。
    【解决方案2】:

    使用下划线/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
    

    【讨论】:

      【解决方案3】:

      以下函数将允许全部或部分应用程序,并将考虑数组访问。它还兼容不支持 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)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        • 2018-04-10
        • 2016-06-11
        • 2019-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多