2017-09-29 7 views
1

内のオブジェクトの配列の属性を組み合わせる:は、私は、このデータセットを持っているの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}, 

.... 
]; 

私はユニーク時間エントリにデータセットを減らすだけでなく、タイムステップごとの値を結合したいです。結果は次のようになります。

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}, 
.... 
]; 

私は他のSOの記事をもとに減らす()メソッドでいろいろ書いてみました:それは5つのエントリにデータセットを減らしますが、構造がない

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

どのように私はそれをしたいと私はオブジェクト値を組み合わせる方法を知らない。

何か助けていただければ幸いです。

+0

何場合:OUには、一時的なkeysプロパティに各反復ステップでtime値を保存することができます'val2'プロパティです。どちらを使うべきですか? –

+0

それから要約する必要があります。 – 3TW3

答えて

4

Array.reduce()バリエーション:

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

優雅な解決策... –

+0

@RenzoCC、ありがとう – RomanPerekhrest

0

あなたは

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

例のようArray methodsを使用することができますY 3 `t3`オブジェクトおよびそれらの2が、例えば含まがあるだろう

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

あなたは何も更新していません。あなたはちょうど最初の「時間」を保ち、重複を取り除いているようです。 – Matt

関連する問題