Перенос объектов с одинаковыми значениями в массив

1

Учитывая, что у нас есть и массив объектов:

let objects = [
  {name: 'bob'},
  {name: 'foo'},
  {name: 'bar'},
  {name: 'foo'},
  {name: 'foo'}
]

Как я могу преобразовать этот массив в этот:

let objects = [
  [
    {name: 'bob'}
  ],
  [
    {name: 'foo'},
    {name: 'foo'},
    {name: 'foo'}
  ],
  [
    {name: 'bar'}
  ]
]

Функции более высокого порядка

Теги:

2 ответа

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

Вы можете использовать метод .reduce() для итерации по массиву и поместить каждый объект в массив в рабочем объекте, от которого Object.values() свойство name, а затем использовать Object.values() для преобразования этого рабочего объекта в массив массивов:

let objects = [
  {name: 'bob'},
  {name: 'foo'},
  {name: 'bar'},
  {name: 'foo'},
  {name: 'foo'}
]

let result = Object.values(objects.reduce((a,c) => {
  if (!a[c.name]) a[c.name] = []
  a[c.name].push(c)
  return a
}, {}))

console.log(result)
  • 0
    Гораздо красивее моего XD
1

let objects = [{
    name: 'bob'
  },
  {
    name: 'foo'
  },
  {
    name: 'bar'
  },
  {
    name: 'foo'
  },
  {
    name: 'foo'
  }
]
let result = objects.reduce((accumulator, currentValue) => {
  if (!Array.isArray(accumulator)) {
    //console.log("once")
    var temp = accumulator;
    accumulator = [
      [],
      [],
      []
    ];
    accumulator[0].push(temp)
    return accumulator;
  }
  
 

  for(var i = 0; i < accumulator.length;i++){
  //console.log(accumulator[i][0],currentValue.name)

    if(accumulator[i][0] == undefined){
    //console.log("was undefined")
      accumulator[i] =[currentValue]
      return accumulator;
    }else if(accumulator[i][0].name == currentValue.name){
      //console.log("found match")
      accumulator[i].push(currentValue)
      return accumulator;
    }  
  }



  return accumulator;
});

console.log(result)

Ещё вопросы

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