对象数组:值作为数组的键?

时间:2018-01-05 15:47:23

标签: javascript angularjs javascript-objects

我有一个对象数组,如下所示;

{
    'data': [{
            value: 1000,
            year: 1990
        },
        {
            value: 1001,
            year: 1990
        },
        {
            value: 1002,
            year: 1990
        },
        {
            value: 1003,
            year: 1991
        },
        {
            value: 1004,
            year: 1991
        }
    ]
}

我想将相同的内容转换为下面的对象

{
    '1990': [{
            value: 1000,
            year: 1990
        },
        {
            value: 1001,
            year: 1990
        },
        {
            value: 1002,
            year: 1990
        }],

    '1991':[{
            value: 1003,
            year: 1991
        },
        {
            value: 1004,
            year: 1991
        }
    ]
}

在Javascript或Angular 4中有没有办法做同样的事情?

1 个答案:

答案 0 :(得分:2)

使用Array#reduce函数迭代每个项目并检查累积对象是否包含具有该键的属性,添加它,为其分配一个数组然后推送该项目进去。如果包含,只需按下该项目。

const data = [{
            value: 1000,
            year: 1990
        },
        {
            value: 1001,
            year: 1990
        },
        {
            value: 1002,
            year: 1990
        },
        {
            value: 1003,
            year: 1991
        },
        {
            value: 1004,
            year: 1991
        }
    ];
    
const mapped = data.reduce((acc, item) => {
   
   if(!acc.hasOwnProperty(item.year)) {
      acc[item.year] = [];
   }
   
   acc[item.year].push(item);
   
   return acc;
    
}, {});

console.log(mapped);