2016-10-03 16 views
1

は私がオブジェクトを持っているように:私はこれは、日付が同じであるTOTALキーに参加し、0で埋める/連結され、以下のような何かにそれを縮小することができますどのように平坦化Javascriptのオブジェクト配列

[ 
    { 
    "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" 
    }, 
... 
] 

ケースには日付が繰り返されない?:

[ 
    { 
    "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"] 
    } 
] 

を、私はこのコードのブロックをしようとしてきたが、TOTALキーにすべて同じ次元を得ることができない - ゼロで埋め罰金だろう。

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'が期待される結果を返すように見えますが、インデックス '2'でオブジェクトのために保存する配列が含まれています'.length'が' 1'であるか? – guest271314

答えて

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

それだけです!とても素敵です:) – mjpramos

0

それは、このような単純なことができます

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

ニースの答え。それがうまくいくならば、私はそれと一緒に行くだろう。唯一のことは、 'DATA'キーを値に変更していることです。これはOPに必要なものではないかもしれません(少なくとも質問の例ではありません)。 – rafaelbiten

+0

ありがとう、本当に「同じ」オブジェクトです。値にアクセスするキーを変更するだけです。私は今ゼロを追加しています。 – inoabrian

関連する問題