2016-10-03 3 views
1

Ich habe ein Objekt wie:Flatten Javascript Objektarray

[ 
    { 
    "DATA": "2016-01-22", 
    "TOTAL": "7" 
    }, 
    { 
    "DATA": "2016-01-25", 
    "TOTAL": "3" 
    }, 
    { 
    "DATA": "2016-01-26", 
    "TOTAL": "1" 
    }, 
    { 
    "DATA": "2016-01-27", 
    "TOTAL": "2" 
    }, 
    { 
    "DATA": "2016-01-22", 
    "TOTAL": "1" 
    }, 
    { 
    "DATA": "2016-01-25", 
    "TOTAL": "1" 
    }, 
    { 
    "DATA": "2016-01-27", 
    "TOTAL": "1" 
    }, 
... 
] 

Wie kann ich es wie unten etwas schrumpfen, das ist, verketten/join die TOTAL-Taste, wo das Datum das gleiche ist und füllen mit 0 den Fall, dass das Datum nicht wiederholen ?:

[ 
    { 
    "DATA": "2016-01-22", 
    "TOTAL": ["7", "1"] 
    }, 
    { 
    "DATA": "2016-01-25", 
    "TOTAL": ["3", "1"] 
    }, 
    { 
    "DATA": "2016-01-26", 
    "TOTAL": ["1", "0"] 
    }, 
    { 
    "DATA": "2016-01-27", 
    "TOTAL": ["2", "1"] 
    } 
] 

ich habe mit diesem Code-Block versucht, aber nicht TOTAL Tasten alle die gleiche Dimension bekommen - gefüllt mit Nullen wäre in Ordnung.

var output = []; 
d.forEach(function(value) { 
    var existing = output.filter(function(v, i) { 
     return v.DATA == value.DATA; 
    }); 
    if (existing.length) { 
     var existingIndex = output.indexOf(existing[0]); 
     output[existingIndex].TOTAL = output[existingIndex].TOTAL.concat(value.TOTAL); 
    } else { 
     if (typeof value.TOTAL == 'string') 
      value.TOTAL = [value.TOTAL]; 
     output.push(value); 
    } 
}); 
console.log(JSON.stringify(output, null, 4)); 
+0

'output' erwartetes Ergebnis zurück erscheint, für das Objekt bei Index '2' speichern enthält einen Array mit '.length' von' 1'? – guest271314

Antwort

1
var someData = [] // <- your instantiated array in question. 
var transformedData = []; 

var highestCount = 0; 

someData.forEach(x => { 
    var foundIndex = transformedData.findIndex((ele) => ele.DATA === x.DATA); 
    if (foundIndex < 0) { 
     transformedData 
      .push({DATA : x.DATA, TOTAL : [x.TOTAL]}); 
    } else { 
     transformedData[foundIndex] 
      .TOTAL.push(x.TOTAL); 
     var currentCountAtIndex = transformedData[foundIndex].TOTAL.length; 
     if (highestCount < transformedData[foundIndex].TOTAL.length) highestCount = currentCountAtIndex; 
    } 
}); 

// fill any indicies in array that are lower than the highest count with 0 
transformedData 
    .forEach(x => { 
     if (x.TOTAL.length < highestCount) { 
      while(x.TOTAL.length < highestCount) { 
       x.TOTAL.push(0); 
      } 
     } 
    }); 
+0

Das war's! Sehr nett :) – mjpramos

0

Es könnte, da dies so einfach sein:

var result = {}; 
 
var test = [ 
 
    { 
 
    "DATA": "2016-01-22", 
 
    "TOTAL": "7" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-25", 
 
    "TOTAL": "3" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-26", 
 
    "TOTAL": "1" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-27", 
 
    "TOTAL": "2" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-22", 
 
    "TOTAL": "1" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-25", 
 
    "TOTAL": "1" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-27", 
 
    "TOTAL": "1" 
 
    }]; 
 

 
console.log("test array: ", test); 
 

 
var len = 0, 
 
sorted; 
 

 
// Flatten the object. 
 
test.forEach(d => { 
 
    result[d.DATA] == undefined ? result[d.DATA] = [d.TOTAL] : result[d.DATA].push(d.TOTAL); 
 
}); 
 

 
// Sort so we get the max length to know how many zeros to add. 
 
sorted = Object.keys(result).sort((k, b) => { 
 
    return result[k].length - result[b].length; 
 
}); 
 

 
// Max length from the sorted array. 
 
len = result[sorted[sorted.length - 1]].length; 
 

 
// push zeros 
 
Object.keys(result).forEach(k => { 
 
    if(result[k].length < len){ 
 
    for(var i = result[k].length; i < len; i++){ 
 
    result[k].push("0"); 
 
    } 
 
    } 
 
}); 
 

 
console.log("result: ", result);

+1

Schöne Antwort. Wenn das funktioniert, würde ich damit gehen. Das einzige Ding ist, dass Sie die 'DATA' Schlüssel zu ihren Werten ändern, die nicht sein können, was das OP braucht (mindestens ist es nicht, was wir im Beispiel der Frage haben) – rafaelbiten

+0

Danke, es ist immer noch wirklich das "selbe" Objekt . Müsste nur ändern, auf welchen Schlüssel Sie mit den Werten zugreifen. Ich füge jetzt die Nullen hinzu. – inoabrian