2017-03-08 43 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)