2016-09-21 1 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

좋아요, 편집하겠습니다. –

답변

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]를 사용할 필요가

도움이 되었기를 바랍니다.

관련 문제