- 예시
_.chunk(['a', 'b', 'c', 'd'], 2);
// => [['a', 'b'], ['c', 'd']]
_.chunk(['a', 'b', 'c', 'd'], 3);
// => [['a', 'b', 'c'], ['d']]
_.chunk(['a', 'b', 'c', 'd', 'e', 'f'], 2);
// => [['a', 'b'], ['c', 'd'], ['e', 'f']]
_.chunk(['a', 'b', 'c', 'd', 'e', 'f', 'g'], 3);
// => [['a', 'b', 'c'], ['d', 'e', 'f'], ['g']]
- 구현
const chunk = (arr, size) => {
const result = [];
// arr 원본을 수정하지 않기 위해, slice로 복사한다.
const copyArr = arr.slice();
// 배열을 돌면서,
copyArr.map(() => {
// splice로 size만큼 원본 배열을 빼면서,
const temp = copyArr.splice(0, size)
// 임시로 만든 result배열로 넣어서 이중배열 구조를 만든다.
result.push(temp)
})
// splice로 배열을 빼버리면서 map으로 탐색 하고 있으므로,
// copyArr를 전부 돌고 나서, 남은 요소들을을 result와 합쳐서 return한다.
return result.concat([copyArr]);
}
- 소감
- 오랜만이니까 제일 앞에 거 해야지 하다가 혈압 올라서 요단강 래프팅 투어 갈 뻔했다. 무시하지 말자...
- 생각보다 어렵다... 마지막 남은 것 처리는 어떻게 하지? 혹은, reduce로 한 번에 처리할 순 없을까?, 제귀로 처리할까? 와 같은 별거 아닌 고민들로 시간을 많이 날렸다.
- 습관적으로 알고리즘을 보면 제귀함수부터 쓰려고 한다. 효율적인 방법도 아니고, 코드 가독성도 그리 좋지 못하니 배열을 순회하는 함수를 조금 더 사용하면 좋을 것 같다.
- slice로 배열을 카피해서 사용하는 것이 아무래도 조금 불편하다. reduce로 한 번에 처리하고 싶다...!