Я хочу преобразовать мой массив в массив массивов с помощью атрибута "значок".
const array = [
{ icon: true },
{ icon: false },
{ icon: false },
{ icon: true },
{ icon: false }
]
Я нуждаюсь:
[[{icon: true}, {icon: false}, {icon: false}], [{{icon: true}, {icon: false}}]]
icon === true
атрибута icon === true
является признаком начала формирования нового массива.
Я думаю, что вы должны использовать функцию уменьшить.
array.reduce((result, item, index) => {... }, [])
Как лучше всего написать преобразование? Спасибо!
Вы можете использовать .reduce()
следующим образом:
const data = [{ icon: true }, { icon: false }, { icon: false }, { icon: true }, { icon: false }]
const result = data.reduce((r, c) => {
if(c.icon === true)
r.push([c]);
else
r[Math.max(r.length - 1, 0)].push(c);
return r;
},[]);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
const array = [
{ icon: true },
{ icon: false },
{ icon: false },
{ icon: true },
{ icon: false }
];
console.log(grouper(array));
function grouper(array) {
return array.reduce((acc, next) => {
const entry = [next];
if (next.icon) return acc.concat([entry]);
const beforeNextCollection = acc.slice(0, acc.length - 1);
const nextCollection = acc[acc.length - 1];
const updatedCollection = nextCollection.concat(entry);
return beforeNextCollection.concat([updatedCollection]);
}, []);
}
Вы можете использовать замыкание над массивом для вставки. Это предотвращает поиск последнего элемента в массиве.
const
data = [{ icon: true }, { icon: false }, { icon: false }, { icon: true }, { icon: false }],
result = data.reduce((a => (r, o) => {
if (o.icon) r.push(a = []);
a.push(o);
return r;
})(), []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Вы можете использовать while
цикл.
const array = [{ icon: true }, { icon: false }, { icon: false }, { icon: true }, { icon: false }]
i = 0;
result = [];
aux = [];
while(i < array.length){
if(array[i].icon){
if(aux.length !== 0){
result.push(aux);
aux = [array[i]];
}
else
aux.push(array[i]);
}
else
aux.push(array[i]);
i++;
}
result.push(aux);
console.log(result);