Преобразовать массив объектов в массив массивов (по атрибуту)

1

Я хочу преобразовать мой массив в массив массивов с помощью атрибута "значок".

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) => {... }, [])

Как лучше всего написать преобразование? Спасибо!

  • 3
    пожалуйста, добавьте то, что вы пробовали.
Теги:
ecmascript-6
object
arrays
reduce

4 ответа

4

Вы можете использовать .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; }
  • 0
    Спасибо! Это прекрасно!
  • 0
    @ user3468894 Добро пожаловать. Пожалуйста, отметьте ответ как принятый, если он полезен.
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]);
  }, []);
}
0

Вы можете использовать замыкание над массивом для вставки. Это предотвращает поиск последнего элемента в массиве.

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; }
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);

Ещё вопросы

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