#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