Учитывая, что у нас есть и массив объектов:
let objects = [
{name: 'bob'},
{name: 'foo'},
{name: 'bar'},
{name: 'foo'},
{name: 'foo'}
]
Как я могу преобразовать этот массив в этот:
let objects = [
[
{name: 'bob'}
],
[
{name: 'foo'},
{name: 'foo'},
{name: 'foo'}
],
[
{name: 'bar'}
]
]
Функции более высокого порядка
Вы можете использовать метод .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)
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)