2015-09-16 15 views

risposta

1

Per la tua domanda specifica:

// Let x hold your array of objects. 

res={}; // Create an empty object that will hold the answer 

x.forEach (function (e) { // Use this function to iterate over each item in the list 
    res[e.list] = res[e.list] || []; // inspired by the Nina Scholz answer below 
    res[e.list].push(e.item); // Append the result to the array 
}); 
+1

Si dovrebbe accettare la Nina Scholz risposta qui sotto. È elegante, non muta una variabile di risultato e offre 'reduce', che vale la pena conoscere. Sarà utile quando/se ascolti la programmazione funzionale. –

1

Quello che stai cercando è un metodo group-by. Questa domanda ha una bella risposta: https://codereview.stackexchange.com/questions/37028/grouping-elements-in-array-by-multiple-properties

Il codice:

function groupBy(array , f) 
{ 
    var groups = {}; 
    array.forEach(function(o) 
    { 
    var group = JSON.stringify(f(o)); 
    groups[group] = groups[group] || []; 
    groups[group].push(o); 
    }); 
    return Object.keys(groups).map(function(group) 
    { 
    return groups[group]; 
    }) 
} 

var result = groupBy(list, function(item) 
{ 
    return [item.lastname, item.age]; 
}); 
8

È possibile utilizzare Array.prototype.reduce per il vostro compito. Consente un valore di ritorno nella funzione di callback per la chiamata successiva.

var data = [ 
 
     { 'list': 'one', 'item': 1 }, 
 
     { 'list': 'one', 'item': 2 }, 
 
     { 'list': 'one', 'item': 3 }, 
 
     { 'list': 'two', 'item': 1 }, 
 
     { 'list': 'two', 'item': 2 } 
 
    ], 
 
    flat = data.reduce(function (r, a) { 
 
     r[a.list] = r[a.list] || []; 
 
     r[a.list].push(a.item); 
 
     return r; 
 
    }, {}); 
 

 
document.write('<pre>' + JSON.stringify(flat, 0, 4) + '</pre>');