2013-06-06 19 views
6

kullanarak başka bir nesne dizisine yassıyorum Bu soruna birden çok bağlam ve dilde karşı çıktım ve her zaman etrafta çalışabildim ama sonunda uygun bir model bulmak istiyorum. Bunu hallet. SQL tablolarına katılmadan geliyor. Genellikle iki arama yapardım, biri öğeler için ve bir tane yorumlar için ama tek bir aramada hepsini elde etmenin ve sonucu dümdüz etmenin bir yolu olduğunu biliyorum.Nesnelerin bir dizisini javascript

[ 
    { 
    itemId: 1, 
    comments: { 
     commentId: 1 
    } 
    }, 
    { 
    itemId: 1, 
    comments: { 
     commentId: 2 
    } 
    }, 
    { 
    itemId: 2, 
    comments: { 
     commentId: 3 
    } 
    } 
] 

Ve bu çevirmek: Ben yapmak istiyorum ne

şöyle bir dizi almaktır

[ 
    { 
    itemId: 1, 
    comments: [ 
     { 
     commentId: 1 
     }, 
     { 
     commentId: 2 
     } 
    ] 
    }, 
    { 
    itemId: 2, 
    comments: [ 
     { 
     commentId: 3 
     } 
    ] 
    } 
] 
+0

whathaveyoutried dot com – akonsu

cevap

1

sizin için çalışmalıdır:

function combine(arr) { 
    var newObj = {}; 

    // combine the comments 
    for (var i=0; i < arr.length; i++) { 
     if (newObj[arr[i].itemId]) { 
      newObj[arr[i].itemId].push(arr[i].comments); 
     } else { 
      newObj[arr[i].itemId] = [arr[i].comments]; 
     } 
    } 

    // make the list 
    var keys = Object.keys(newObj); 
    return keys.map(function(key){return {itemId: key, comments: newObj[key]} }) 
} 
+0

"Object.keys" sırasının sırasının iyi tanımlanmadığını ve öğeleri yanlışlıkla yeniden sıralayabileceğinizi unutmayın. –

+0

Ayrıca, Object.keys'nin IE'de bulunmadığını ve eklenmesi gerektiğini unutmayın (es5shim) –

+1

Ayrıca, ES5'i zaten kullandığınız için, son adım için 'Array # map' gibi olabilirsiniz. Biraz daha okunabilir ;-) –

1

Ayrıca filter():

'ü de kullanabilirsiniz. 210
function combine(src) { 
    var dict = {}; 
    return src.filter(function(item) { 
     if (!dict[item.itemId]) { 
      item.comments = [ item.comments ]; 
      dict[item.itemId] = item; 
      return true; 
     } else { 
      dict[item.itemId].comments.push(item.comments); 
      return false; 
     } 
    }); 
} 
İlgili konular