Создание новых объектов на основе общего свойства в предыдущем массиве объектов

1

У меня есть массив объектов, содержащих ключ "год" и ключ "дата", например:

    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'}
];

Я хочу создать новый массив объектов, содержащих год и даты, но где ключ "дата" - это массив, как показано ниже. Как я могу это сделать?

var final = [
{ 'year': '2018', date: ['2018-01', '2018-02']},
{ 'year': '2017', date: ['2017-03', '2017-04']},
{ 'year': '2016', date: ['2016-04', '2016-06']}
]
Теги:
object
arrays
grouping

3 ответа

1
Лучший ответ

Вы можете использовать Array.reduce() для получения этого вывода:

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'}
];
var final = fullDates.reduce((acc, obj)=>{
  var existingObj = acc.find(item => item.year === obj.year);
  if(existingObj){
    existingObj.date.push(obj.date);
    return acc;
  }
  obj.date = [obj.date];
  acc.push(obj);
  return acc;
}, []);
console.log(final);
  • 0
    хе-хе, такой же подход. избили 2 минуты :). Разница лишь в том, что я не меняю текущий объект.
  • 0
    Работает Чудеса, большое спасибо
Показать ещё 1 комментарий
1

Вы можете использовать array#reduce.

За каждый год, создать object, содержащий year и dates свойства и для каждого повторяющегося year добавить date в array. Затем получите все значения из этого аккумулятора object.

const 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'} ],
    result = Object.values(fullDates.reduce((r, {year, date}) => {
      r[year] = r[year] || {year, dates : []};
      r[year].dates.push(date);
      return r;
    },{}));
console.log(result);
0

Надеюсь это поможет:

    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, []);
  • 0
    Ваш подход должен знать все ключи объекта в fullDates когда вы создаете новый объект, так что это добавит сложности, если в объекте много свойств.
  • 0
    Это абсолютно верно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню