all-of-frontend/Answer/1 ~ 10/6.md
2021-03-25 08:04:50 +08:00

1.6 KiB

/**
 * @param input
 * @param size
 * @returns {Array}
 */
_.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'], 5)
// => [['a', 'b', 'c', 'd']]

_.chunk(['a', 'b', 'c', 'd'], 0)
// => []

这道题目其实就是让大家实现一个 lodash 里的函数,这边我们需要注意的一个点是不能更改原数组,虽然题目没有提到,但是我们得想到这个。

笔者这里推荐几个答案,分别是不同的写法,难度从低到高吧。

首先是遍历的写法:

答案链接

function chunk(arr, num) {
  if (num === 0) return [];
  if (Array.isArray(arr) && typeof num === "number") {
    let result = [];
    let i = 0;
    while (i < arr.length) {
      result.push(arr.slice(i, i + num));
      i += num;
    }
    return result;
  } else {
    console.log("params type error");
  }
}

我们也可以使用 reduce 来解题:

答案链接

const chunk = (arr, len) => arr.reduce((pre, cur, index) => {
  if (index % len === 0) {
    pre.push([cur])
    return pre
  }
  const temp = pre[pre.length - 1]
  temp && temp.push(cur)
  return pre
}, [])

甚至直接优化到一行:

答案链接

function chunk(arr, size){
  return Array.from({length: (size = Number.parseInt(size)) ? Math.ceil(arr.length/size) : 0})
    .map((a,i) => arr.slice(i*size, (i+1)*size))
}