2016-09-21 4 views
1

ネストされたオブジェクトを検索するなど、キーで値を取得する関数を作成しようとしています。ここでJavascript - ネストされたオブジェクトを含むキーで値を取得する

は限り私が得たようである:

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

}

誰かが準備と作業この機能を持っているか、私の問題を解決することができた場合、それは素晴らしいことだろう。誰かがこれを行うことができるアンダースコア機能を知っていれば、それは素晴らしいことになります。

+0

typeof演算はnull'なのではiterate'が欠落しているオブジェクトは、 ''で、何のブラケットを必要としません。 –

+0

同じキーを持つすべての値を取得しようとしていますか?そうであれば、オブジェクトを深く掘り下げる関数を再帰的に呼び出す。 – Leolian

+0

OK、編集させてください。 –

答えて

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

+0

perfactly。 –

1

問題は、キーへの参照を反復関数に渡しているだけですが、渡された元のオブジェクトを参照することはありません。

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

+0

結果を試して投稿する。編集のためにありがとう、それは長い一日だった(: –

+0

それはあなたがオブジェクトがnullでないことを確認していないエラーIDを取得するか、どちらか、それは素晴らしい作品、 –

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')); 
1

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 
(jQueryのから少し助けを借りて)次のように、 obj[prop]を使用する必要があります

こちらがお役に立てば幸いです。

関連する問題