Javascript - 按键检索值,包括嵌套对象

时间:2016-09-21 13:55:56

标签: javascript json underscore.js

我正在尝试编写一个按键检索值的函数,包括在嵌套对象中搜索。

据我所知:

function getByKey (obj, key) {
   if(obj.hasOwnProperty(key)){
         return obj[key];
   }else{
      for(var prop in obj){
          if(typeof prop  == "object" && prop !== null){
             if(prop.hasOwnProperty(key)){
               return prop[key];
             }else{
               return iterate(prop, key);
             }
          }
     }
  }

}

如果有人准备好这个功能并且能够解决我的问题,那将会非常棒。如果有人知道可以做到这一点的下划线功能,那就太棒了。

4 个答案:

答案 0 :(得分:3)

您可以使用迭代和递归样式来搜索对象的属性。

function getByKey(obj, key) {
    function iter(o) {
        if (o !== null && typeof o === 'object') {
            if (key in o) {
                value = o[key];
                return true;
            }
            return Object.keys(o).some(function (k) {
                return iter(o[k]);
            });
        }
    }

    var value;
    iter(obj);
    return value;
}

var o = { a: 1, b: { c: 3, d: 4, e: { f: 5, g: 6 } } }

console.log(getByKey(o, 'f')); // 5
console.log(getByKey(o, 'b')); // { c: ... }
console.log(getByKey(o, 'd')); // 4
console.log(getByKey(o, 'q')); // undefined
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:2)

请尝试以下操作:https://jsfiddle.net/0yqu339t/4/

function getByKey(obj, key) {
      if (obj.hasOwnProperty(key)) {
        return obj[key];
      } else {
        for (var prop in obj) {
          if (typeof(obj[prop]) === "object") {
            return getByKey(obj[prop], key);
          }
        }
      }
    }


    var o = {
      a: 1,
      b: {
        c: 3,
        d: 4,
        e: {
          f: 5,
          g: 6
        }
      }
    }
    console.log(getByKey(o, 'f'));
    console.log(getByKey(o, 'b'));
    console.log(getByKey(o, 'd'));

答案 2 :(得分:1)

问题是你只是将对密钥的引用传递给迭代函数,但从不引用传递给它的原始对象。您需要使用obj[prop],如下所示:

function getByKey (obj, key) 
{
    if( obj.hasOwnProperty(key) )
    {
        return obj[key];
    }
    else
    {
        for(var prop in obj)
        {
            if( typeof obj[prop] == "object")
            {
                if(obj[prop].hasOwnProperty(key))
                {
                    return obj[prop][key];
                }
                else
                {
                  return getByKey(obj[prop], key);
                }
            }
        }
    }
};

jsFiddle Demo

答案 3 :(得分:1)

对于递归,您可以尝试(在JQuery的帮助下)

var haystack = $.map(obj, function(value, index) {
    return [value];
});
var values = []; //or {} depending your situation
var getValues = function( needle, haystack, array ){
    if( haystack[key]) !== 'undefined' ){
      array.push(haystack[key]);
    }else{
      for( var i = 0; i < haystack.length; i++ ){
            getValues( needle , haystack[i], array );
      }
    }
}
getValues( 'key', haystack, values );
console.log(values);  //should be an array [ value1, value2, value3, value4, ... ]
//With all values that have this same searched key

我希望这会有所帮助