2015-09-16 9 views
6

mit habe ich ein Array von Objekten mit folgendem Formatein assoziatives Array in Javascript Erstellen von Kartenfunktion

[{'list': 'one', 'item': 1}, 
{'list': 'one', 'item': 2}, 
{'list': 'one', 'item': 3}, 
{'list': 'two', 'item': 1}, 
{'list': 'two', 'item': 2}] 

Und ich will es wie diese

[{'one': [1, 2, 3]}, 
{'two': [1, 2]}] 

verwandeln Wie kann ich es tun Verwenden der Array.map-Funktion? Es ist die beste Alternative?

Antwort

1

Um Ihre Frage:

// 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

sollten Sie die Nina Scholz unten beantworten nehmen. Es ist elegant, mutiert nicht eine Ergebnisvariable, und bietet "reduce", was es wert ist, darüber zu lernen. Es wird nützlich sein, wenn/wenn Sie die funktionale Programmierung übernehmen. –

1

Was Sie suchen, ist eine Gruppierung nach Methode. Diese Frage hat eine schöne Antwort: https://codereview.stackexchange.com/questions/37028/grouping-elements-in-array-by-multiple-properties

Der Code:

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

Sie Array.prototype.reduce für Ihre Aufgabe verwenden. Es ermöglicht einen Rückgabewert in der Rückruffunktion für den nächsten Anruf.

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>');

Verwandte Themen