2013-06-06 22 views
6

Mam do czynienia z tym problemem w wielu kontekstach i językach i zawsze byłem w stanie obejść to, ale chciałbym w końcu znaleźć odpowiedni wzór do załatw to. Pochodzi z łączenia tabel SQL. Zwykle wykonuję dwa połączenia, jeden dla przedmiotów i jeden dla komentarzy, ale wiem, że istnieje sposób, aby uzyskać to wszystko w jednym połączeniu, a następnie spłaszczyć wynik.Spłaszczanie tablicy obiektów w innej tablicy obiektów przy użyciu javascript

Co chciałbym zrobić, to podjąć tablicę, która wygląda tak:

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

i przekształcić go w ten sposób:

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

whathaveyoutried dot com – akonsu

Odpowiedz

1

Poniższy powinny pracować dla Ciebie:

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

Pamiętaj, że kolejność 'Object.keys' nie jest dobrze zdefiniowana i możesz przypadkowo zmienić kolejność elementów. –

+0

Należy również zauważyć, że "Object.keys" nie istnieje w IE i musi zostać dodany (es5shim) –

+1

Również, ponieważ już używasz ES5, możesz polubić 'Array # map' dla ostatniego kroku. Jest nieco bardziej czytelny ;-) –

1

Możesz również użyć filter():

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; 
     } 
    }); 
} 
Powiązane problemy