Фрагмент массива Javascript с некоторыми правилами

#javascript #arrays #chunks

Вопрос:

нужна твоя помощь. У меня есть массив, подобный;

 const arr = 
  [ { item: { 0: 'asd' },                                     que: '1.question asdsad ... '    } 
  , { item: { 0: 'asd' },                                     que: '2.question asdsad ... '    } 
  , { item: { 0: 'asd', 1: 'asdsa', 2: 'asdsa', 3: 'asdsa' }, que: '3.question asdsad ... '    } 
  , { item: { 0: 'xx', 1: 'ssss', 2: 'ggg' },                 que: 'Question asdsad ... '      } 
  , { item: { 0: 'asd' },                                     que: '4.question asdsad ... '    } 
  , { item: { 0: 'asd' },                                     que: '5.sdd asdsad ... '         } 
  , { item: { 0: 'bbb', 1: 'bbb' },                           que: 'Dsad question asdsad ... ' } 
  ]
 

Как вы видите, у каждого из них разные данные. Я хочу создать новый массив, подобный массиву блоков. Но это должно быть;

 **Maximum array length  = 2
**Order must be same 
**if array item length bigger than 3 or equal, it creates self array.
**if array item que does not begin with number, it create self array.
 

Ожидаемый результат составляет;

 const expArr = 
  [ [ { item: { 0: 'asd' },                                     que: '1.question asdsad ... '    } 
    , { item: { 0: 'asd' },                                     que: '2.question asdsad ... '    } 
    ] 
  , [ { item: { 0: 'asd', 1: 'asdsa', 2: 'asdsa', 3: 'asdsa' }, que: '3.question asdsad ... '    } ] 
  , [ { item: { 0: 'xx', 1: 'ssss', 2: 'ggg' },                 que: 'Question asdsad ... '      } ] 
  , [ { item: { 0: 'asd' },                                     que: '4.question asdsad ... '    } 
    , { item: { 0: 'asd' },                                     que: '5.sdd asdsad ... '         } 
    ] 
  , [ { item: { 0: 'bbb', 1: 'bbb' },                           que: 'Dsad question asdsad ... ' } ] 
  ] 
 

Я попытался использовать метод разбиения массива на куски.

 arr.reduce((prev, next)  => {
    if(Object.keys(next.item).length >= 3) {
        // Can be what
    }
    if(isNaN(next.que.split('')[0])) {
        // Can be what
    }
    
})
 

Приведенная выше функция по-прежнему дает мне массив двух размеров, не применяется правило

Ответ №1:

Я вижу это таким образом…

 const arr = 
  [ { item: { 0: 'asd' },                                     que: '1.question asdsad ... '    } 
  , { item: { 0: 'asd' },                                     que: '2.question asdsad ... '    } 
  , { item: { 0: 'asd', 1: 'asdsa', 2: 'asdsa', 3: 'asdsa' }, que: '3.question asdsad ... '    } 
  , { item: { 0: 'xx', 1: 'ssss', 2: 'ggg' },                 que: 'Question asdsad ... '      } 
  , { item: { 0: 'asd' },                                     que: '4.question asdsad ... '    } 
  , { item: { 0: 'asd' },                                     que: '5.sdd asdsad ... '         } 
  , { item: { 0: 'bbb', 1: 'bbb' },                           que: 'Dsad question asdsad ... ' } 
  ]


const maxSize = 2
const itemMax = 3
const result  = []
let lastArr   = null

for (let row of arr)
  {
  let len = Object.keys(row.item).length 

  if ((len >= itemMax) || isNaN(row.que.charAt(0)))
    {
    result.push([row])
    lastArr = null
    }
  else
    {
    if (!lastArr || lastArr.length >= maxSize)
      {
      lastArr = new Array()
      result.push(lastArr)
      }
    lastArr.push(row)
    }
  }

console.log( result ) 
 .as-console-wrapper { max-height: 100% !important; top: 0 } 

Комментарии:

1. Это не сработает, если третий объект arr = , { item: { 0: 'asd' }, que: '3.question asdsad ... ' } Он добавится в новый массив вместо того, чтобы держать его вместе

2. @JosephTroy нет, мой ответ верен, вы забыли правило максимальной длины массива = 2

3. ах, да. Вы правы!

Ответ №2:

В принципе, вы можете зациклить каждый объект и в if инструкции выяснить, добавлен ли объект в новый массив или он добавлен в существующий массив. Это легче увидеть в этом фрагменте:

 const arr = 
  [ { item: { 0: 'asd' },                                     que: '1.question asdsad ... '    } 
  , { item: { 0: 'asd' },                                     que: '2.question asdsad ... '    } 
  , { item: { 0: 'asd', 1: 'asdsa', 2: 'asdsa', 3: 'asdsa' }, que: '3.question asdsad ... '    } 
  , { item: { 0: 'xx', 1: 'ssss', 2: 'ggg' },                 que: 'Question asdsad ... '      } 
  , { item: { 0: 'asd' },                                     que: '4.question asdsad ... '    } 
  , { item: { 0: 'asd' },                                     que: '5.sdd asdsad ... '         } 
  , { item: { 0: 'bbb', 1: 'bbb' },                           que: 'Dsad question asdsad ... ' } 
  ];
  
  let arNew = [];
  let arTmp = [];
  let sCurItemO = '';
  for(const obj of arr){
    if(obj.item['0'] != sCurItemO || arTmp.length == 2 || Object.keys(obj.item).length > 2 || isNaN(obj.que.substring(0, 1))){
      if(arTmp.length)
        arNew.push(arTmp)
      arTmp = [obj]
    }
    else
        arTmp.push(obj);
    sCurItemO = obj.item['0'];
  }
  arNew.push(arTmp);
  
  console.log(arNew) 

Комментарии:

1. Обновлен ответ, чтобы учесть максимальную длину массива = 2