2014-10-10 4 views
0

나는 각각의 단일 반복 요소를 기반으로 더 나은 용어 'zip'또는 'merge'json 객체를 부족하게하려고합니다. 예 : LoDash 또는 밑줄로밑줄/lodash - 동일한 요소를 가진 객체 결합

var new_obj = { 
    123:[ 
     CATS:{ 
      LIST:[ 
       {result1:CAT1}, 
       {result2:CAT2}      
      ] 
     }, 
     DOGS:{ 
      LIST:[ 
       {result1:DOG1}, 
       {result2:DOG2}      
      ]    
     } 
    ], 
    987:[ 
     CATS:{ 
      LIST:[ 
       {result1:CAT3}, 
       {result2:CAT4}      
      ] 
     }, 
     DOGS:{ 
      LIST:[ 
       {result1:DOG3}, 
       {result2:DOG4}      
      ]    
     } 
    ]   
} 

부분 아니 ... 작동 무엇이든 사용하기 행복 :

var obj = { 
    CATS:[ 
     { 
      id:123, 
      LIST:[ 
       {result1:CAT1}, 
       {result2:CAT2} 
      ] 
     }, 
     { 
      id:987, 
      LIST:[ 
       {result1:CAT3}, 
       {result2:CAT4} 
      ] 
     } 
    ], 
    DOGS:[ 
     { 
      id:123, 
      LIST:[ 
       {result1:DOG1}, 
       {result2:DOG2} 
      ] 
     }, 
     { 
      id:987, 
      LIST:[ 
       {result1:DOG3}, 
       {result2:DOG4} 
      ] 
     } 
    ]  
} 

내가 만들 수 OBJ 내에서 중첩 된 '아이디'를 사용하고 싶습니다. 감사합니다.

**주의! ie8과 호환되어야합니다. 블레! 당신을 가정 **

휴, 약간의 시행 착오 후, 나는 당신이 필요로 할 수도 있습니다
+0

원하는 출력의 구조가 잘못되었습니다. 키'123'의 값은 배열로 간주되지만 키 - 값 쌍으로 채워집니다. '123'을 대상으로 삼았습니까? –

답변

1

...

var result = _.reduce(obj, function(memo, group, key) { 
    var ids = _.map(group, function(g) { 
    return g.id; 
    }); 

    _.each(ids, function(id) { 
    var obj = {}; 

    obj[key] = {}; 
    obj[key].LIST = _.filter(group, function(g) { 
     return g.id === id; 
    }).map(function(g) { 
     return g.LIST; 
    })[0]; 

    memo[id] = (memo[id] || []); 

    memo[id].push(obj); 
    }); 

    return memo; 
}, {}); 

작업을 확인 ... http://jsbin.com/gabako/1/edit

+1

여러분, 우리는 경쟁 - 아! @ jcreamer898 예 결과가 올바른지 ...하지만 그것은 최선의 방법입니까? 귀하의 신속한 답변 +1. 체크 표시를하는 도중에 ... – bkbarton

2

123의 가치를위한 IE8 들어

Object.keys(obj).reduce(        // Reduce the keys in the input 
    function(result, animals) {       // by taking each key like DOGS 
    animals.forEach(         // and for each of its 
     function(animal) {        // elements (animal) 
     result[animal.id] = result[animal.id] || {}; // create an ID field in result 
     result[animal.id][animals] = animal.list;  // add animal's list of results 
     }); 
    return result;         // and pass result to next key 
    }, 
    {} 
); 

관련 polyfills을 사용 출력 키 밑줄 또는 lodash 중 다음없이 해시 대신 배열된다. 또는 밑줄/등호를 사용하여 재 작성하십시오.

+0

두 라이브러리 중 하나를 사용하지 않는다는 사실을 사랑하지만 ... ie8 호환이 필요합니다. 믿습니다 .reduce() 및 .forEach()는 적용 할 수 없습니다. 전에 언급하지 않아서 미안해. – bkbarton

+1

심 (shim)을 아직 사용하지 않으 셨다면 반드시 있어야합니다. https://github.com/es-shims/es5-shim을 참조하십시오. –