[javascript] Lodash를 사용하여 자바 스크립트 배열을 청크로 분할

JavaScript 배열을 n크기가 지정된 청크 로 분할해야합니다 .

예 : 주어진 배열

["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"]

a n가 4이면 출력은 다음과 같아야합니다.

[ ["a1", "a2", "a3", "a4"],
  ["a5", "a6", "a7", "a8"],
  ["a9", "a10", "a11", "a12"],
  ["a13"]
]

이 문제에 대한 순수한 JavaScript 솔루션 을 알고 있지만 이미 Lodash를 사용하고 있기 때문에 Lodash가 이에 대한 더 나은 솔루션을 제공하는지 궁금합니다.

편집하다:

밑줄 솔루션이 얼마나 느린 지 확인하기 위해 jsPerf 테스트 를 만들었습니다 .



답변

lodash의 청크를 살펴보세요 : https://lodash.com/docs#chunk

const data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
const chunks = _.chunk(data, 3);
console.log(chunks);
// [
//  ["a1", "a2", "a3"],
//  ["a4", "a5", "a6"],
//  ["a7", "a8", "a9"],
//  ["a10", "a11", "a12"],
//  ["a13"]
// ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>


답변

Underscore 기반 솔루션의 경우 다음을 시도하십시오.

var data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
var n = 3;
var lists = _.groupBy(data, function(element, index){
  return Math.floor(index/n);
});
lists = _.toArray(lists); //Added this to convert the returned object to an array.
console.log(lists);

체인 래퍼 방법을 사용하면 다음과 같이 두 문을 결합 할 수 있습니다.

var data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
var n = 3;
var lists = _.chain(data).groupBy(function(element, index){
  return Math.floor(index/n);
}).toArray()
.value();


답변

더 간단한 표현 :

const coll = [ "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9" ];
const n = 2;
const chunks = _.range(coll.length / n).map(i => coll.slice(i * n, (i + 1) * n));
console.log(chunks);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>


답변

밑줄은 1.9.0 버전부터 기본적으로 _.chunk ()를 지원합니다 .

const data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
const chunks = _.chunk(data, 4);
console.log(chunks);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore.js"></script>


답변

이것을 시도하는 것이 훨씬 더 실용적입니다 (예를 들어, 각 하위 배열의 컨테이너가 될 항목의 양에 따라 배열을 분할하려는 경우).

function chunk(arr, start, amount){
    var result = [],
        i,
        start = start || 0,
        amount = amount || 500,
        len = arr.length;

    do {
        //console.log('appending ', start, '-', start + amount, 'of ', len, '.');
        result.push(arr.slice(start, start+amount));
        start += amount;

    } while (start< len);

    return result;
};

귀하의 경우에 사용 :

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],
    chunked = chunk(arr, 0, Math.floor(arr.length/3)); //to get 4 nested arrays

console.log(chunked);

다른 경우 :

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],
    chunked = chunk(arr, 0, 3); // to get 6 nested arrays each containing maximum of 3 items

console.log(chunked);


답변