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
中对象的所有键,以便在对象中有许多属性时增加复杂性。这是绝对正确的。