#javascript
Как на JavaScript можно разбить массив на не более, чем 5 частей в случае разного состава объектов в массиве? Например, из: a= [{A:'A'}, {B:'B'}, {C:'C'}, {D:'D'}, {E:'E'}, {F:'F'}, {G:'G'}, {H:'H'}, {I:'I'}]; Получить: b= [{a:{A:'A'}, b:{B:'B'}}, {c:{C:'C'}, d:{D:'D'}}, {e:{E:'E'}, f:{F:'F'}}, {g:{G:'G'}, h:{H:'H'}}, {i:{I:'I'}}]; P.s. Спасибо за ответы!
Ответы
Ответ 1
«Правильный» вариант с reduce() – ведь формально мы из массива получаем какое-то одно значение. Тоже массив, в данном случае. var a = [{A:'A'}, {B:'B'}, {C:'C'}, {D:'D'}, {E:'E'}, {F:'F'}, {G:'G'}, {H:'H'}, {I:'I'}]; function splitTo( arr, n) { var plen = Math.ceil(arr.length / n); return arr.reduce( function( p, c, i, a) { if(i%plen === 0) p.push({}); p[p.length-1][i] = c; return p; }, []); } var result = splitTo( a, 3); document.body.innerText = JSON.stringify(result); Нужно знать длину отрезка – округлением в бОльшую сторону деления длины на число отрезков. Метод массива .reduce() применяет к каждому элементу ф-ю, переданную 1-м параметром, и возвращает одно значение. 2-м параметром даётся начальное значение. Ф-я принимает 4 параметра: «текущее» значение – сначала оно берётся из «начального значения», а потом оно – то, что вернул предыдущий запуск этой ф-ии с предыдущим элементом массива; очередной элемент из массива; индекс очередного элемента; весь массив, на всякий случай. Внутри поступаем просто. Если индекс делится на длину отрезка без остатка, то пора дописать в результат пустой объект. И в любом случае в последний элемент результата дописываем ключём – индекс, а значением очередной элемент массива. Прелесть в том, что не нужно проверять какие-то условия, осталось ли что-то в «хвосте» и т.п. Красота! Первоначальный вариант ответа, принятый ТС: Чтобы разделить на 5 (пусть, переменная, parts) частей, надо вычислить, какой длины должны быть части: len = Math.ceil( a.length / parts); // округлить в бОльшую сторону И потом идём по элементам, набирая по len элементов, пока не закончатся: var a = [{A:'A'}, {B:'B'}, {C:'C'}, {D:'D'}, {E:'E'}, {F:'F'}, {G:'G'}, {H:'H'}, {I:'I'}]; var parts = 5; // сколько частей var len = Math.ceil( a.length / parts) ,out = [] ,obj = {} ,i ; for( i=0; iОтвет 2
Еще один вариант с использованием метода slice() function chunkArray(arr, chunk) { var i, j, tmp = []; for (i = 0, j = arr.length; i < j; i += chunk) { tmp.push(arr.slice(i, i + chunk)); } return tmp; } var a = [ {A:'A'}, {B:'B'}, {C:'C'}, {D:'D'}, {E:'E'}, {F:'F'}, {G:'G'}, {H:'H'}, {I:'I'} ]; console.log(chunkArray(a, 2));Ответ 3
Ну если строго по твоей задаче то както так(ответ не идеальний конечно). Если хочешь генерировать ключи то можеш брать значение I или просто себе брать из масива какогото. var a= [{A:'A'}, {B:'B'}, {C:'C'}, {D:'D'}, {E:'E'}, {F:'F'}, {G:'G'}, {H:'H'}, {I:'I'}]; var b = []; for (var i = 0; i < a.length; i+=2) { var objToPush = {}; var partOne = a[i]; var keyOne = Object.keys(partOne).shift(); objToPush[keyOne] = partOne; var partTwo = a[i+1]; if (partTwo) { var keyTwo = Object.keys(partTwo).shift(); objToPush[keyTwo] = partTwo; } b.push(objToPush) } document.body.innerText = JSON.stringify(b); Если тебе надо максимум 5 то в for поставь максимум 10 в переборе. Надеюсь тебе ето поможет.Ответ 4
Последовательное заполнение результирующего массива, строго не судите let a = [{ A: 'A' }, { B: 'B' }, { C: 'C' }, { D: 'D' }, { E: 'E' }, { F: 'F' }, { G: 'G' }, { H: 'H' }, { I: 'I' } ]; sliceArray = (arr, n) => { let newArray = []; for (let k = 0; k < n; k++) { newArray[k] = [] } for (let i = 0; i < arr.length; i += n) { let tempArray = arr.slice(i, i + n); for (let j = 0; j < n; j++) { if (tempArray[j]) { newArray[j].push(tempArray[j]) } } } return newArray }; console.log(sliceArray(a, 5))
Комментариев нет:
Отправить комментарий