Javascript 基于先前对象数组中的共享属性创建新对象

Javascript 基于先前对象数组中的共享属性创建新对象,javascript,arrays,object,grouping,Javascript,Arrays,Object,Grouping,我有一个包含“年”键和“日期”键的对象数组,如下所示: var fullDates = [ { 'year': '2018', date: '2018-01'}, { 'year': '2017', date: '2017-02'}, { 'year': '2016', date: '2016-03'}, { 'year': '2018', date: '2018-04'}, { 'year': '2017', date: '2017-05' }, { 'year': '2016', d

我有一个包含“年”键和“日期”键的对象数组,如下所示:

    var fullDates = [
{ 'year': '2018', date: '2018-01'},
{ 'year': '2017', date: '2017-02'},
{ 'year': '2016', date: '2016-03'},
{ 'year': '2018', date: '2018-04'},
{ 'year': '2017', date: '2017-05' },
{ 'year': '2016', date: '2016-06'}
];
我想创建一个新的对象数组,其中包含年份和日期,但“date”键是如下所示的数组。我该怎么做

var final = [
{ 'year': '2018', date: ['2018-01', '2018-02']},
{ 'year': '2017', date: ['2017-03', '2017-04']},
{ 'year': '2016', date: ['2016-04', '2016-06']}
]

您可以使用
Array.reduce()
操作来获得该输出:

var fullDates=[
{年份:'2018',日期:'2018-01'},
{年份:'2017',日期:'2017-02'},
{年份:'2016',日期:'2016-03'},
{年份:'2018',日期:'2018-04'},
{年份:'2017',日期:'2017-05'},
{年份:'2016',日期:'2016-06'}
];
var final=完整日期。减少((acc,obj)=>{
var existingObj=acc.find(item=>item.year===obj.year);
如果(现有对象){
现有目标日期推送(目标日期);
返回acc;
}
obj.date=[obj.date];
加速推力(obj);
返回acc;
}, []);
控制台日志(最终)希望这有助于:

    var fullDates = [
{ 'year': '2018', date: '2018-01'},
{ 'year': '2017', date: '2017-02'},
{ 'year': '2016', date: '2016-03'},
{ 'year': '2018', date: '2018-04'},
{ 'year': '2017', date: '2017-05' },
{ 'year': '2016', date: '2016-06'}
];



const reducer = (accumulator, currentValue) => {

    let yearData = accumulator.find(x => x.year == currentValue.year);
    if(yearData !== undefined){
        yearData.date.push(currentValue.date);
    }
    else{
        accumulator.push({ 'year': currentValue.year, date: [currentValue.date]});
    }


    return accumulator;
}


var final = fullDates.reduce(reducer, []);
您可以使用
array#reduce

对于每一年,创建一个
对象
,其中包含
日期
属性,对于每个重复的
数组中添加
日期
。然后从该
对象
累加器获取所有值

const fullDates=[{'year':'2018',date:'2018-01'},{'year':'2017',date:'2017-02'},{'year':'2016',date:'2016-03'},{'year':'2018',date:'2018-04'},{'year':'2017-05'},{'year':'2016',date 2016-06'},
结果=Object.values(fullDates.reduce((r,{year,date})=>{
r[年]=r[年]|{年,日期:[]};
r[year].dates.push(日期);
返回r;
},{}));

控制台日志(结果)呵呵,同样的方法。被2分钟击败:)。唯一的区别是我不改变当前对象。@fredd5229很高兴能帮忙。你试过什么?!您的问题在哪里?在创建新对象时,您可能需要知道
fullDates
中对象的所有键,以便在对象中有许多属性时增加复杂性。这是绝对正确的。