2013-02-27 2 views
2

나는 이런 유형의 패턴에 따라 (변경할 수)는 API에서 나에게 전송되는 객체가 있습니다최적의 방법

{ 
    aaa: { 
    name: "Aaa", 
    desc: "..." 
    }, 
    bbb: { 
    name: "Bbb", 
    desc: "..." 
    }, 
    ccc: { 
    name: "Ccc", 
    desc: "...", 
    stuff: { 
     foo: { 
     bar: "bar" 
     }, 
     keys: ["foo"] 
    } 
    }, 
    keys: ["aaa", "bbb", "ccc"] 
} 

난 할 노력하고있어 것은 "를 평평 "이러한 객체는 클라이언트에서 더 유용한 객체로 변환됩니다. 그래서 위의 객체를 병합의 결과는 다음과 같습니다

[ 
    { 
    key: "aaa", 
    name: "Aaa", 
    desc: "..." 
    }, 
    { 
    key: "bbb", 
    name: "Bbb", 
    desc: "..." 
    }, 
    { 
    key: "ccc", 
    name: "Ccc", 
    stuff: [ 
     { key: "foo", bar: "bar" } 
    ]  
    } 
] 

당신이 볼 수 있듯이 내가 통과해야하는 데이터의 2 개 수준에있을 수 있습니다. 현재 새로운 객체를 반복하고 만들고 있습니다 (간단한 예 : 아래). 좀 더 우아한 방법이 있는지 궁금합니다.

var myObjs = []; 

$(data.keys).each(function(i, objKey) { 
    i = $.extend({}, data[objKey], { key: objKey }); 
    myObjs.push(i); 
}); 
+2

왜이 작업을 수행해야합니까? 'for ... in'은 옵션이 아닌가? – Shmiddty

답변

1

이 필요한 일을 할 것 같다 중첩 된 객체가 있습니다. 현재 두 단계로 중지되지 않습니다.

1

이 그것을 수행해야합니다

function flatten(obj) { 
    return $.map(obj.keys, function(key) { 
     var res = $.extend({}, obj[key], {key: key}); 
     for (var key in res) { 
      if (typeof res[key] === 'object') { 
       res[key] = flatten(res[key]); 
      } 
     } 
     return res; 
    }); 
} 

http://jsfiddle.net/alnitak/pgq2S/

NB를 참조하십시오 :이 재귀 계속됩니다 너무 오래 같은

function toArray(obj) { 
    if (typeof obj !== 'object' || !("keys" in obj)) 
     return obj; 
    return obj.keys.map(function(key) { 
     var sub = obj[key]; 
     if (typeof sub !== 'object') 
      return sub; 
     for (var prop in sub) 
      sub[prop] = toArray(sub[prop]); 
     sub.key = key; 
     return sub; 
    }); 
}