2017-09-29 3 views
1

Ich habe diesen Datensatz:die Attribute eines Arrays von Objekten in Javascript

var dataset = [ 
{time: "t1", val1: 0, val2: 0, val3: 1}, 
{time: "t2", val1: 0, val2: 0, val3: 4}, 
{time: "t3", val1: 1, val2: 0, val3: 0}, 
{time: "t4", val1: 3, val2: 0, val3: 0}, 
{time: "t2", val1: 0, val2: 3, val3: 0}, 
{time: "t4", val1: 0, val2: 2, val3: 0}, 
{time: "t5", val1: 2, val2: 0, val3: 0}, 

.... 
]; 

Ich mag den Datensatz unique Zeiteinträge zu reduzieren, sondern auch die Werte pro Zeitschritt kombinieren. Das Ergebnis muss wie folgt aussehen:

var dataset = [ 
{time: "t1", val1: 0, val2: 0, val3: 1}, 
{time: "t2", val1: 0, val2: 3, val3: 4}, 
{time: "t3", val1: 1, val2: 0, val3: 0}, 
{time: "t4", val1: 3, val2: 2, val3: 0}, 
{time: "t5", val1: 2, val2: 0, val3: 0}, 
.... 
]; 

Ich habe versucht, some mit dem Verfahren reduzieren() basierend auf anderen SO-Beiträge:

dataset.reduce(function(r,o){ 
var key = o.Date; 
var newObj = o; 
if (r[key] || (r[key]=[])) r[key].push(o); 
    return r; 
}, []); 

console.log(dataset); 

Es reduziert die Datenmenge auf 5 Einträge, aber die Struktur ist nicht genau wie ich es will und ich kann die Objektwerte nicht kombinieren.

Jede Hilfe wird geschätzt.

+0

Was, wenn es t3' Objekte und zwei von ihnen drei 'enthalten wäre z.B. 'val2' Eigenschaft. Welcher sollte benutzt werden? –

+0

Dann sollten sie zusammengefasst werden. – 3TW3

Antwort

4

Array.reduce() Variation:

var dataset = [ 
 
    {time: "t1", val1: 0, val2: 0, val3: 1}, {time: "t2", val1: 0, val2: 0, val3: 4}, 
 
    {time: "t3", val1: 1, val2: 0, val3: 0}, {time: "t4", val1: 3, val2: 0, val3: 0}, 
 
    {time: "t5", val1: 2, val2: 0, val3: 0}, {time: "t2", val1: 0, val2: 3, val3: 0}, 
 
    {time: "t4", val1: 0, val2: 2, val3: 0} 
 
], 
 
result = []; 
 

 
dataset.reduce(function(r, o){ 
 
    var k = o.time; // crucial key (used for grouping entries) 
 
    if (r[k]) { 
 
     r[k].val1 +=o.val1; 
 
     r[k].val2 +=o.val2; 
 
     r[k].val3 +=o.val3; 
 
    } else { 
 
     result.push(o); 
 
     r[k] = o; 
 
    } 
 
    return r; 
 
}, {}); 
 

 
console.log(result);

+2

Elegante Lösung ... –

+0

@RenzoCC, danke – RomanPerekhrest

0

Sie Array methods wie das Beispiel verwenden können

var dataset = [ 
 
{time: "t1", val1: 0, val2: 0, val3: 1}, 
 
{time: "t2", val1: 0, val2: 0, val3: 4}, 
 
{time: "t3", val1: 1, val2: 0, val3: 0}, 
 
{time: "t4", val1: 3, val2: 0, val3: 0}, 
 
{time: "t5", val1: 2, val2: 0, val3: 0}, 
 
{time: "t2", val1: 0, val2: 3, val3: 0}, 
 
{time: "t4", val1: 0, val2: 2, val3: 0} 
 
]; 
 

 
var datasetReduced=[]; 
 

 
dataset.forEach(function(dataItem){ 
 
    var reducedItem = datasetReduced.find(function(element){ 
 
    return element.time === dataItem.time; 
 
    }); 
 
    if(reducedItem){ 
 
    
 
    reducedItem.val1= reducedItem.val1 + dataItem.val1; 
 
    reducedItem.val2= reducedItem.val2 + dataItem.val2; 
 
    reducedItem.val3= reducedItem.val3 + dataItem.val3; 
 
    }else{ 
 
    datasetReduced.push(dataItem); 
 
    } 
 
}); 
 
console.log(datasetReduced);

1

Y ou können die time Werte bei jeder Iteration Schritt in eine temporäre keys Eigenschaft speichern:

var dataset = [ 
    { time: "t1", val1: 0, val2: 0, val3: 1 }, 
    { time: "t2", val1: 0, val2: 0, val3: 4 }, 
    { time: "t3", val1: 1, val2: 0, val3: 0 }, 
    { time: "t4", val1: 3, val2: 0, val3: 0 }, 
    { time: "t5", val1: 2, val2: 0, val3: 0 }, 
    { time: "t2", val1: 0, val2: 3, val3: 0 }, 
    { time: "t4", val1: 0, val2: 2, val3: 0 }, 
]; 

var newData = dataset.reduce(function (r, o) { 
    if (r.keys[o.time] !== true) { 
     r.data.push(o); 
    } 
    r.keys[o.time] = true; 
    return r; 
}, { data: [], keys: {} }).data; 

console.log(newData); 
//[ { time: 't1', val1: 0, val2: 0, val3: 1 }, 
// { time: 't2', val1: 0, val2: 0, val3: 4 }, 
// { time: 't3', val1: 1, val2: 0, val3: 0 }, 
// { time: 't4', val1: 3, val2: 0, val3: 0 }, 
// { time: 't5', val1: 2, val2: 0, val3: 0 } ] 
+0

Sie aktualisieren nichts. Es scheint, dass Sie nur die erste Zeit behalten und die Duplikate loswerden. – Matt

Verwandte Themen