2016-11-10 3 views
0

Ich habe ein Array von Objekten, die ich in eine Tabelle konvertieren muss (Art der Daten zu schwenken). Wenn ich das sage, muss ich ein weiteres Array von Objekten mit den eindeutigen Titeln erhalten, die verschachtelte Arrays von Objekten mit Paaren der Werte haben. Könntest du bitte einen Blick darauf werfen und mir helfen, was ich brauche? Bitte beachten Sie das Original und die gewünschte Anordnung unter:Wie pivotiere ich ein Array von Objekten in JavaScript?

Original-Array:

[ 
{title: "Title1", value1: "value1", value2: "value2"}, 
{title: "Title2", value1: "value1", value2: "value2"}, 
{title: "Title1", value1: "value1", value2: "value2"}, 
{title: "Title3", value1: "value1", value2: "value2"}, 
{title: "Title2", value1: "value1", value2: "value2"}, 
{title: "Title1", value1: "value1", value2: "value2"}, 
{title: "Title3", value1: "value1", value2: "value2"}, 
{title: "Title1", value1: "value1", value2: "value2"}, 
] 

Wunschergebnis:

[ 
{title: "Title1", values: [{value1: "value1"}, {value2: "value2"}]}, 
{title: "Title2", values: [{value1: "value1"}, {value2: "value2"}]}, 
{title: "Title3", values: [{value1: "value1"}, {value2: "value2"}]}, 
] 

Dank wenn Voraus für alle Anregungen.

+2

Zu viele doppelte "value1" "value2" für Ihr Beispiel machen auch keinen Sinn. – Paulpro

+0

ist das Ergebnis wirklich das gewünschte Ergebnis? –

Antwort

1

Sie könnten eine Hash-Tabelle zum Gruppieren als thisArg mit Array#forEach verwenden.

var data = [{ title: "Title1", value1: "value1", value2: "value2" }, { title: "Title2", value1: "value1", value2: "value2" }, { title: "Title1", value1: "value1", value2: "value2" }, { title: "Title3", value1: "value1", value2: "value2" }, { title: "Title2", value1: "value1", value2: "value2" }, { title: "Title1", value1: "value1", value2: "value2" }, { title: "Title3", value1: "value1", value2: "value2" }, { title: "Title1", value1: "value1", value2: "value2" }], 
 
    grouped = []; 
 

 
data.forEach(function (a) { 
 

 
    // check if title is not in hash table 
 
    if (!this[a.title]) { 
 

 
     // if not, create new object with title and values array 
 
     // and assign it with the title as hash to the hash table 
 
     this[a.title] = { title: a.title, values: [] }; 
 

 
     // add the new object to the result set, too 
 
     grouped.push(this[a.title]); 
 
    } 
 

 
    // create a new object with the other values and push it 
 
    // to the array of the object of the hash table 
 
    this[a.title].values.push({ value1: a.value1, value2: a.value2 }); 
 
}, Object.create(null)); // Object.create creates an empty object without prototypes 
 

 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Danke, Nina! Genau das wollte ich. Darf ich Sie bitten, dem Code einige Kommentare hinzuzufügen, da ich gerne mehr über das, was wir hier haben, erfahren würde? Aber es ist nicht so wichtig, wenn du keine Zeit hast, werde ich versuchen, alles selbst zu untersuchen. –

1
var originalArray = [ 
     {title: "Title1", value1: "value1", value2: "value2"}, 
     {title: "Title2", value1: "value1", value2: "value2"}, 
     {title: "Title1", value1: "value1", value2: "value2"}, 
     {title: "Title3", value1: "value1", value2: "value2"}, 
     {title: "Title2", value1: "value1", value2: "value2"}, 
     {title: "Title1", value1: "value1", value2: "value2"}, 
     {title: "Title3", value1: "value1", value2: "value2"}, 
     {title: "Title1", value1: "value1", value2: "value2"}, 
    ]; 
    var newArray = []; 

    for(var i = 0; i<originalArray.length; i++){ 
     var object = {}; 
     object.title=originalArray[i].title; 
     var values = []; 
     values.push({value1: originalArray[i].value1}); 
     values.push({value2: originalArray[i].value2}); 
     object.values= values; 
     newArray.push(object); 
    } 

Dies funktioniert, obwohl ehrlich gesagt, ich weiß nicht, warum Sie einige duplizierten tittles haben. Ich stellte fest, dass es nur ein Beispiel war. Wenn nicht, ist die Antwort eine andere.

1

ein einfaches Array reduzieren

let data = [{ 
 
    title: "Title1", 
 
    value1: "value1", 
 
    value2: "value2" 
 
}, { 
 
    title: "Title2", 
 
    value1: "value1", 
 
    value2: "value2" 
 
}, { 
 
    title: "Title1", 
 
    value1: "value1", 
 
    value2: "value2" 
 
}, { 
 
    title: "Title3", 
 
    value1: "value1", 
 
    value2: "value2" 
 
}, { 
 
    title: "Title2", 
 
    value1: "value1", 
 
    value2: "value2" 
 
}, { 
 
    title: "Title1", 
 
    value1: "value1", 
 
    value2: "value2" 
 
}, { 
 
    title: "Title3", 
 
    value1: "value1", 
 
    value2: "value2" 
 
}, { 
 
    title: "Title1", 
 
    value1: "value1", 
 
    value2: "value2" 
 
}]; 
 

 
let pivoted = data.reduce((prev, cur) => { 
 
    let existing = prev.find(x => x.title === cur.title); 
 

 
    if (existing) 
 
    existing.values.push(cur) 
 
    else 
 
    prev.push({ 
 
     title: cur.title, 
 
     values: [cur] 
 
    }); 
 

 
    return prev; 
 
}, []); 
 

 
console.log(pivoted);

API von Hilfe sein, verwendet

Reduce

Find

Diese

könnte dann zu schwenken angepasst werden, indem jedem Feld, das Sie sich wünschen, wäre es die Fehlerbehandlung müssen hinzufügen, wenn das Feld nicht jedoch existiert:

let pivotBy = (key, data) => data.reduce((prev, cur) => { 
    let existing = prev.find(x => x[key] === cur[key]); 

    if (existing) { 
    existing.values.push(cur); 
    } else { 
    let toInsert = { 
     values: [cur] 
    } 

    toInsert[key] = cur[key]; 

    prev.push(toInsert); 
    } 

    return prev; 
}, []); 

EDIT ich die gewünschte Ausgabeformat falsch interpretiert, aber die Reducce-Ansatz könnte geändert werden, um diese Anforderung zu erfüllen.

Verwandte Themen