2017-03-08 39 views
-1

我有一個平坦的列表,像這樣:如何在JavaScript中將平面數組排序爲[鍵,數組]數組?

[ 
{year: 2017, value: 1 }, 
{year: 2017, value: 2 }, 
{year: 2017, value: 3 }, 
{year: 2018, value: 1 }, 
{year: 2018, value: 2 }, 
{year: 2018, value: 3 }, 
{year: 2019, value: 1 }, 
] 

等。

我想重組這樣的:

[ 
{year: 2017, values: [1, 2, 3] }, 
{year: 2018, values: [1, 2, 3] }, 
{year: 2019, values: [1] }, 
] 

甚至

{ 
    "2017": [1, 2, 3], 
    "2018": [1, 2, 3], 
    "2019": [1] 
} 

我我只是想每年獲得一個數組。我怎麼能做到這一點?

+0

好了,廢話。我四處搜尋,但似乎確實如此。 – rball

回答

0

完整的解決方案,那麼:

var aY=[ 
    {year: 2017, value: 1 }, 
    {year: 2017, value: 2 }, 
    {year: 2017, value: 3 }, 
    {year: 2018, value: 1 }, 
    {year: 2018, value: 2 }, 
    {year: 2018, value: 3 }, 
    {year: 2019, value: 1 } 
]; // your example 
var oYs= {}; // the new structure 
for(var i= 0; i < aY.length; i++){ 
    var y= aY[i].year; 
    if (oYs[y]==null){ 
    oYs[y]= []; // create a new array of values 
    } 
    oYs[y].push(aY[i].value); // append the new value 
} 
-3

這會更容易些:

{ 
    "2017": [1, 2, 3], 
    "2018": [1, 2, 3], 
    "2019": [1] 
} 
+0

好的,當然。如果數據結構可能發生變化,那麼也可以。你會怎麼做? – rball

+0

例如:obj [「2017」] = [「1」]然後obj [「2017」]。push(「2」)等 – Koen

+1

請僅在實際答案中使用* Post answer *按鈕。 –

1

這裏是一個解決方案:

const a = [ 
    {year: 2017, value: 1 }, 
    {year: 2017, value: 2 }, 
    {year: 2017, value: 3 }, 
    {year: 2018, value: 1 }, 
    {year: 2018, value: 2 }, 
    {year: 2018, value: 3 }, 
    {year: 2019, value: 1 } 
] 

// you can take advantage of the famous Array.reduce method. 
// object solution 
const b = a.reduce(function(prev,current){ 
    if(prev[current.year]){ 
    // if the key already exists, it means we should push 
    prev[current.year].push(current.value) 
    }else{ 
    // if the key does't exist, create it and add the value to an empty array 
    prev[current.year] = [current.value]; 
    } 

    return prev; 

},{}) 
console.log(b); // { '2017': [ 1, 2, 3 ], '2018': [ 1, 2, 3 ], '2019': [ 1 ] } 

// array solution(it is kind of dependant on the previous solution) 
const c = [] 
for (key in b){ 
    if(b.hasOwnProperty(key)){ 
    c.push({year:key,value:b[key]}); 
    } 
} 
console.log(c); // [ { year: '2017', value: [ 1, 2, 3 ] }, { year: '2018', value: [ 1, 2, 3 ] }, { year: '2019', value: [ 1 ] } ] 
+1

哦拍,這也看起來很棒。 – rball

0

如果你想返回一個對象作爲結果你可以簡單地使用reduce()

var data = [ 
 
{year: 2017, value: 1 }, 
 
{year: 2017, value: 2 }, 
 
{year: 2017, value: 3 }, 
 
{year: 2018, value: 1 }, 
 
{year: 2018, value: 2 }, 
 
{year: 2018, value: 3 }, 
 
{year: 2019, value: 1 }, 
 
] 
 

 
var result = data.reduce(function(r, e) { 
 
    if(!r[e.year]) r[e.year] = [] 
 
    r[e.year].push(e.value) 
 
    return r 
 
}, {}) 
 

 
console.log(result)