2014-02-19 72 views
1

我編寫了此函數來搜索並返回對象中深度屬性的值,並想知道是否有方法使用遞歸或類似的方法來使函數執行同樣的事情,但代碼少(可能要刪除最多五個屬性深度可以測試的限制)。返回深屬性的值(如果它們存在的話)

如果函數存在,該函數將返回一個較深的屬性值,否則返回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; 
} 

回答

1

.reduce對此很有用。

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

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

您忘記了電話......否則,良好的工作 – dandavis

+0

呀,只是抓住了這一點。謝謝。 :-) –

+1

非常好。似乎適用於迄今爲止我測試過的所有情況。出色的工作,再加上它迫使我學習一些新的概念。 – esnm

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 
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) 
} 
相關問題