2014-10-10 59 views
0

我想基於每個單獨的重複出現的元素缺少更好的術語'zip'或'合併'json對象。例如:下劃線/ lodash - 將具有相同元素的對象合併到一起

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內創建「ID」:

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

不偏LoDash或下劃線...樂於使用任何作品。 謝謝!

**警告!必須是ie8兼容的。的Bleh! **

+0

您所需的輸出結構無效。鍵123的值應該是一個數組,但用鍵值對填充。你的意思是'123'是一個物體嗎? – 2014-10-10 17:14:41

回答

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 2014-10-10 17:05:39

2

假設你想要的123的價值在輸出鍵是散列而非陣列,然後在沒有任何下劃線或lodash:

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

對於IE8,使用相關polyfills。或者使用下劃線/ lodash等價物做明顯的重寫。

+0

愛你不使用任何一個庫......但我需要它是ie8兼容的事實。我確實相信.reduce()和.forEach()不適用。對不起,以前沒有提及。 – bkbarton 2014-10-10 17:25:23

+1

如果你還沒有使用墊片,你應該。請參閱https://github.com/es-shims/es5-shim。 – 2014-10-10 17:26:48

相關問題