JS разделить массив объектов по полю объекта - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть массив токенов:

[
    {type: 'name', value: 'foo'},
    {type: 'string', value: 'bar'},
    {type: 'special', value: ','},
    {type: 'name', value: 'buzz'}
]

И я хотел бы разделить их на значение, равное ,:

[
    [
        {type: 'name', value: 'foo'},
        {type: 'string', value: 'bar'}
    ],
    [
        {type: 'name', value: 'buzz'}
    ]
]

Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Использование forEach

let arr = [
    {type: 'name', value: 'foo'},
    {type: 'string', value: 'bar'},
    {type: 'special', value: ','},
    {type: 'name', value: 'buzz'}
]

let op = [];
let temp = [];
arr.forEach((e,i)=>{
  if(e.value === ',' && temp.length){
    op.push(temp);
    temp =[];
  } else {
    temp.push(e);
  }
});
if(temp.length) op.push(temp);
console.log(op);
0 голосов
/ 08 декабря 2018

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

  1. Значение элемента: , - добавить новый подмассив без элемента.
  2. Нет подмассива - добавить новый суб-массивмассив с элементом.
  3. Остальное - добавить элемент в последний под-массив.

const data = [
    {type: 'name', value: 'foo'},
    {type: 'string', value: 'bar'},
    {type: 'special', value: ','},
    {type: 'name', value: 'buzz'}
];

const result = data.reduce((r, o) => {
  if(o.value === ',') return [...r, []];
  if(!r.length) return [[o]];
  
  r[r.length - 1].push(o);
  
  return r;
}, []);

console.log(result);
...