KieSun / all-of-frontend

你想知道的前端内容都在这

Home Page:https://yuchengkai.cn/docs/frontend

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

第六题:实现一个 chunk 函数

KieSun opened this issue · comments

commented
/**
 * @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)
// => []

去答题

新建了一个大厂真题每日打卡群,有意愿学习打卡的再进,群已达扫码上线,请加好友拉你进群

function chunk(input, size) {
    size = Math.max(toInteger(size), 0)
    if (!Array.isArray(input)) {
        return []
    }
    if (size < 1) {
        return []
    }
    const n = input.length
    const result = []
    let start = 0
    while (start < n) {
        result.push(input.slice(start, start + size))
        start += size
    }
    return result
}

可以参考lodash源码

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
}, [])
commented
function chunk(arr, len) {
  if (len === 0) return []
  return arr.reduce((prev, item, index) => {
    const value = Math.floor(index / len),
      remainder = index % len
    remainder === 0 ? prev.push([item]) : prev[value].push(item)
    return prev
  }, [])
}
const _ = {};

_.chunk = function (arr, num) {
  const res = [];
  return step(res, arr, 0, num);
};

function step(res, arr, index, num) {
  const len = arr.length;
  if (index >= len || num <= 0) return res;
  const chunk = [];
  for (let i = index; i < index + num; ++i) {
    arr[i] && chunk.push(arr[i]);
  }
  res.push(chunk);
  // console.log(res);
  return step(res, arr, index + num, num);
}
function chunk(arr = [], size) {
    let result = [];
    if (size === 0) return result;
    let len = arr.length;
    if (size >= len) return arr;
    if (size > Math.ceil(len / 2)) return [arr.slice(0, size), arr.slice(size)];
    for (let i = 0; i < len; i++) {
        let index = i + size - 1;
        if (index >= len) {
            result.push(arr.slice(i));
            break;
        } else {
            result.push(arr.slice(i, index + 1));
        }
        i = index;
    }
    return result;
}

const chunk = (array, size) => {
const res = []
Array.from({ length: Math.ceil(array.length / size) }, (value, index) => {
res.push(array.slice(+value * size, (index + 1) * size))
})
return res
}

//_.chunk(array, size)
//根据size参数将数组分组,size是每一组的长度。如果数组不能均分,最后一组就会包含剩下的元素。
let _ = {}
_.chunk  = function (arr,size) {
if(arr.length == 0||!size) return[]
if(arr.length<= size) return arr
let result = []
while (arr.length){
    result.push(arr.splice(0,size))
}
return result
}

`
function chunk(arr, n) {

  let i = 0, result = []
  if (n == 0 || arr.length == 0) {
    return []
  }

  while(i < arr.length) {
    let chunks = []
    for (let j = 0; j < n && i < arr.length; j++) {
      chunks.push(arr[i])
      i++
    }
    result.push(chunks)
  }

  return result
}

`

const chunk = (arr, chunkSize) =>
  arr.reduce((acc, cur, index) => {
    index % chunkSize === 0 ? acc.push([cur]) : acc[acc.length - 1].push(cur);
    return acc;
  }, []);
let _={};
			_.chunk=function(arr,length){
				let result=[];
				let num=Math.ceil(arr.length/length);
				let index=0;
				for(let i=0;i<num;i++){
					console.log(index,num,arr,length,arr.slice(index,index+length))
					result.push(arr.slice(index,index+length));	
					index=index+length;
				}
				return result
			}
function chunk (arr, size) {
    if (!size) return arr
    const len = Math.ceil(arr.length / size)
    const ret = []
    let first = 0
    let end = size
    for (let i = 0; i < len; i++) {
      const temp = arr.slice(first, end)
      first = size
      end = first + size + 1
      ret.push(temp)
    }
    return ret
  }

const _ = {
chunk: function (input, size) {
let arrs = []
if (!Array.isArray(input) || size < 1 || input.length === 0) {
return arrs
}
for (let i = 0; i < input.length; i = i + size){
arrs.push(input.slice(i, i + size))
}
return arrs
}
}

function chunk(array, size) {
  if(size === 0) {
    return []
  }
  if(size >= array.length) {
    return [array.slice()]
  }
  const arr = []
  const num = array.length / size
  for(let i = 0; i < num; i++) {
    arr.push(array.slice(i*size, (i + 1)*size))
  }
  return arr
}
// 第六题:实现一个 chunk 函数
/**
 * @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)
// => []
function chunk(arr, size){
    // 首先是数组array是否合法的判断:
    let length = arr === null ? 0 : arr.length;
    if(!length) return [];
    //排除
    if(size < 1) return [];
    // 
    const result = [];
    let start = 0;
    while (start < length) {
        result.push(arr.slice(start, start + size));
        start += size;
    }
    return result;
}
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");
  }
}
commented
function chunk(arr, number) {
  if (number < 0 || arr.length === 0) {
    return arr;
  }
  const total = arr.length / number;
  const newArr = [];
  for (let i = 0; i < total; i++) {
    console.log(arr.slice(i * number, (i + 1) * number))
    newArr.push(arr.slice(i * number, (i + 1) * number));
  }
  return newArr
}
const chunk = (array: any[], size = 1) => {
    size = Math.max(size, 0);

    if (!array.length || size <= 0) {
      return [];
    }

    let _chunkArray: any[][] = [];
    let _chunkIndex = 0;

    while(_chunkIndex < Math.ceil(array.length / size)) {
      _chunkArray[_chunkIndex] = array.slice(_chunkIndex * size, (++_chunkIndex) * size);
    }

    return _chunkArray;
  }
      function chunk(array, size) {
        if (size == 0) {
          return [];
        }
        let flag = -1;
        let arr = [];
        for (let i = 0; i < array.length; i++) {
          if (i % size == 0) {
            arr[++flag] = [];
          }
          arr[flag].push(array[i]);
        }
        return arr;
      }

      console.log(chunk(["a", "b", "c", "d"], 2));
      console.log(chunk(["a", "b", "c", "d"], 3));
      console.log(chunk(["a", "b", "c", "d"], 5));
      console.log(chunk(["a", "b", "c", "d"], 0));

image

function chunk (arr, size){
  if (!Array.isArray(arr) || !size) return []
  if (size >= arr.length) return arr
  let result = []
  let i = 0
  while (i < arr.length) {
    result.push(arr.slice(i, i + size));
    i += size;
  }
  return result;
}
function chunk(arr, length) {
  if (length <= 0) return [];
  const res = arr.reduce((prev, a) => {
    const l = prev.length;
    if (l === 0 || prev[l - 1].length === length) {
      prev.push([a]);
    } else {
      prev[l - 1].push(a);
    }
    return prev;
  }, []);
  return res;
}
function _chunk(input, size = 1) {
  if (!Array.isArray(input)) return;
  if (input.length === 0 || size < 1) return [];
  const newLength = Math.ceil(input.length / size);
  const result = new Array(newLength);
  for (let i = 0; i < newLength; i++) {
    result[i] = input.slice(size * i, size * (i + 1));
  }
  return result;
}

预先解释一下,chunk 函数输入两个值,第一个:待分块的数组,第二个:每块的长度。该函数将数组按照长度分块,如果剩余的元素数量不足一块,则按照一块处理。

我是百度了之后才了解这个函数的……题目中给的例子需要加一个:

_.chunk([1,2,3,4,5],2)
=>[[1,2],[3,4],[5]]

这样就完整了

看评论区都是直接上来就给答案,我确实很佩服……

chunk(input,size){
      let array = []
        if (size<=0||!input){
          console.log(array)
          return array
        }else if(input.length<=size){
          array = [input]
          console.log(array)
          return array
        }else{
          for (const i of input){
           array.push(input.splice(0,size))
          }
      }
      if(input.length!=0){
        array.push(input)
      }
        console.log(array)
        return array
    }
let _ = {
    chunk: function (arr, size) {
        if (size === 0) {
            return [];
        }
        const nums = Math.ceil(arr.length / size);
        const res = [];
        for (let i = 0; i <= nums - 1; i++) {
            res.push(arr.slice(i * size, (i + 1) * size));
        }
        return res;
    }
};

/**
 * @param input
 * @param size
 * @returns {Array}
 */
console.log(_.chunk(['a', 'b', 'c', 'd'], 2));
// => [['a', 'b'], ['c', 'd']]

console.log(_.chunk(['a', 'b', 'c', 'd'], 3));
// => [['a', 'b', 'c'], ['d']]

console.log(_.chunk(['a', 'b', 'c', 'd'], 5));
// => [['a', 'b', 'c', 'd']]

console.log(_.chunk(['a', 'b', 'c', 'd'], 0));
// => []
function chunk(input, size) {
  if (size == 0) {
    return [];
  }
  let newArr = [];
  let n = Math.ceil(input.length / size);
  for (let i = 0; i < n; i++) {
    newArr.push(input.slice(size * i, size * (i+1)));
  }
  return newArr;
}

Edit JavaScript学习
测试结果

console.log(chunk(["a", "b", "c", "d"], 0));
console.log(chunk(["a", "b", "c", "d"], 1));
console.log(chunk(["a", "b", "c", "d"], 2));
console.log(chunk(["a", "b", "c", "d"], 3));
console.log(chunk(["a", "b", "c", "d"], 4));
console.log(chunk(["a", "b", "c", "d"], 5));

image

commented

第一个参数是数组 第二参数分成几份
利用第二个参数跟第一数组的长度做一下向上取整,
循环的时候push到[]中 顺便删除掉推进去的数组但保持其原有的下标。

function chunk(arr, num){
if(num < 1 || arr.length < 1){ return []}
let nums = Math.ceil(arr.length / num)
let datas = []
for(let i = 0; i<nums; i++){
datas.push(arr.slice(num * i, num * (i + 1)))
}
return datas
}

let myChunk = function(input, size) {
     if (!Array.isArray(input)) return;
     let result = [];
     if (size === 0) return [];
     if (size < input.length)  {
        result.push(input.slice(0, size),  input.slice(size))
     } else {
        result.push(input.slice(0, size))
     }
     return result;
}

let a=['a','b','c','d'];
function chunk(arr,num){
if(!Array.isArray(arr)){
return
}
let newArr;
let len=arr.length;
if(num===0){
newArr = []
}else if(num>=len){
newArr= [arr]
}else{
let n1=arr.slice(0,num);
let n2=arr.slice(num,len);
newArr=[n1,n2]
}
return newArr

}
console.log(chunk(a,3));

刚刚理解错chunk的意思 这样就可以了

const chunk = (source: any[], size: number) => {
    let newSource: any[] = [];
    const len = source.length;
    if (size > 0) {
        const overGroup = len % size;
        const groupCount = Math.floor(len / size);
        let result = [];
        for (let i = 0; i < groupCount; i++) {
            result.push(source.slice(i * size, (i + 1) * size))
        }
        if (overGroup > 0) {
            result.push(source.slice(len - overGroup, len))
        }
        newSource = result;

    };
    console.log(newSource, 'wwwww');
    return newSource;
}

chunk(['a', 'b', 'c', 'd'], 0)
chunk(['a', 'b', 'c', 'd'], 1)
chunk(['a', 'b', 'c', 'd'], 2)
chunk(['a', 'b', 'c', 'd'], 3)
chunk(['a', 'b', 'c', 'd'], 4)
chunk(['a', 'b', 'c', 'd'], 5)

Typescript 版本实现 👋

使用 Array.from 构建新数组,并进行迭代截取。

Edit 6-chunk

interface Lodash {
  chunk: <T>(input: Array<T>, size: number) => Array<Array<T>>;
}

const _: Lodash = {
  chunk: (input, size) => {
    if (size === 0) return [];
    return Array.from(Array(Math.ceil(input.length / size)), (v, i) =>
      input.slice(i * size, i * size + size)
    );
  }
};

测试:

console.log(_.chunk(["a", "b", "c", "d"], 2));
console.log(_.chunk(["a", "b", "c", "d"], 3));
console.log(_.chunk(["a", "b", "c", "d"], 5));
console.log(_.chunk(["a", "b", "c", "d"], 0));

输出:

+ [['a', 'b'], ['c', 'd']]
+ [['a', 'b', 'c'], ['d']]
+ [['a', 'b', 'c', 'd']]
+ []

好像使用 Array.prototype.reduce 也能实现:

const _: Lodash = {
  chunk: (input, size) => {
    return input.reduce((arr, item, idx) => {
      return idx % size === 0
        ? [...arr, [item]]
        : [...arr.slice(0, -1), [...arr.slice(-1)[0], item]];
    }, []);
  }
}

function chunk(input, size) {
if (input.length <= size) return input
let newArr = []
while (input.length > 0) {
newArr.push(input.splice(0, size))
}
return newArr
}

let _ = {}
_.chunk = function (arr, len) {
  let res = []
  if (arr.length === 0 || len === 0) {
    return res
  }
  let item = []
  for (let i = 0; i < arr.length; i++) {
    item.push(arr[i])
    if ((i + 1) % len === 0) {
      res.push(item)
      item = []
    }
  }

  item.length > 0 && res.push(item)
  return res
}
function trunk(arr,size){
    if (!Array.isArray(arr)&&typeof size!='number') return
    if(size<1){
        return []
    }else{
        let sizes = arr.length/Math.floor(size);
        if(sizes>1){
            let resaultarr = []
            for(let i=0;i<arr.length;i+=size){
                resaultarr.push(arr.slice(i,Math.floor(size)+i)) 
            }
            // return resaultarr
            console.log(resaultarr)
        }else{
            return [arr]
        }
    }
}
commented
function chunk(arr, size) {
  size = Math.max(0, size);

  if (!Array.isArray(arr) || size === 0) return [];
  if (size === 1) return arr;

  let res = [];
  for (let i = 0; i < arr.length; i += size) {
    res.push(arr.slice(i, i + size));
  }

  return res;
}
/**
 * Desc: 实现一个 chunk 函数
 * Date: 2021-03-15
 * Author: Akimto
 *
 * @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)
    // => []
 */

/**
 * 
 * @param array 数组
 * @param size 分块大小
 * @returns 返回新结果数组
 */
const chunk = (array: any[], size: number) => {
    if (!Array.isArray(array)) {
        return [];
    }
    if (array.length == 0) {
        return [];
    }
    let resultArray = [];
    let resultIndex = 0;
    let currentIndex = 0;
    while (currentIndex < array.length) {
        resultArray[resultIndex] = array.slice(currentIndex, currentIndex + size);
        resultIndex++;
        currentIndex += size;
    }
    return resultArray;
}

const res = chunk(['a', 'b', 'c', 'd'], 2);
console.log(res);

Output:
image

Edit LeetCodeExercise
const chunk = (arr, group = 1, arr2 = []) => {
  const arr1 = [...arr]
  if (group <= 0) {
    return []
  }
  const end = Math.round(group)
  while (arr1.length) {
    arr2.push(arr1.splice(0, end))
  }
  return arr2
}

console.log(chunk([1, 2, 3, 4, 5, 6, 7, 8, 9], 10))
//[1,2,3,4,5,6,7,8,9]
commented
const _ = {};
_.chunk = (input, size) => {
    if(Object.prototype.toString.call(input) !== '[object Array]') {
        return new TypeError('请输入数组!')
    }
    if(!size) {
        return []
    }
    if(size > input) {
        return [input]
    }

    const targetArr = []
    const recurseFunc = (arr) => {
        if(arr.length > size) {
          targetArr.push(arr.splice(0, size))
         return recurseFunc(arr)
        } 
        return targetArr.push(arr)
    }
    recurseFunc(input)
    
    return targetArr
}

const chunk = (input = [], size = 0) => {
  if (size === 0) {
    return []
  }
  let start = 0
  let len = input.length
  let result = []
  while (start < len) {
    result.push(input.slice(start, start + size))
    start += size
  }
  return result
}

console.log(chunk(['a', 'b', 'c', 'd'], 2))
console.log(chunk(['a', 'b', 'c', 'd'], 3))
console.log(chunk(['a', 'b', 'c', 'd'], 5))
console.log(chunk(['a', 'b', 'c', 'd'], 0))
function chunk(input, size) {
  if(size < 1) return [];
  let result = []
  let max = Math.ceil(input.length / size)
  for(let i = 1; i <= max; i++) {
    result.push(input.slice((i - 1)*size, i*size))
  }
  return result
}

console.log(chunk([1,2,3,4,5], 2))
PS C:\Users\Y_D\Desktop\daka> node .\06题.js
[ [ 1, 2 ], [ 3, 4 ], [ 5 ] ]

function chunk(arr, num){ const r = []; while(arr.length && num){ r.push(arr.splice(0, num)) } return r }

function chunk(arr, size) {
let newArr = []
if (!Array.isArray(arr)) return newArr
if (size < 1) return newArr
while (arr.length) {
newArr.push(arr.splice(0, size))
}
return newArr
}

console.log(chunk(['a', 'b', 'c', 'd','e'], 2))
function chunk(input, size) {
  if (!Array.isArray(input)) {
        return []
  }
  if(!size) return [];

  const n = input.length;
  const result = [];
  let start = 0;
  while (start <= n-1) {
    result.push(input.slice(start,start+size));
    start += size;
  }
  return result;
}
commented
function chunk(arr, len) {
    const res = [];
    let temp = [];
    if (len === 0) {
        return [];
    }
    for (let i = 0; i < arr.length; i++) {
        temp.push(arr[i]);
        if (temp.length === len) {
            res.push(temp);
            temp = [];
        }
    }
    if (temp.length != 0) {
        res.push(temp);
    }
    return res;
};
console.log(chunk(['a', 'b', 'c', 'd'], 2));
console.log(chunk(['a', 'b', 'c', 'd'], 3));
console.log(chunk(['a', 'b', 'c', 'd'], 5));
console.log(chunk(['a', 'b', 'c', 'd'], 0));

[ [ 'a', 'b' ], [ 'c', 'd' ] ]
[ [ 'a', 'b', 'c' ], [ 'd' ] ]
[ [ 'a', 'b', 'c', 'd' ] ]
[]

尽量一行代码来实现

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))
}
let _ = {
  chunk
}
console.log(JSON.stringify(_.chunk(['a', 'b', 'c', 'd'], 2)))
console.log(JSON.stringify(_.chunk(['a', 'b', 'c', 'd'], 3)))
console.log(JSON.stringify(_.chunk(['a', 'b', 'c', 'd'], 5)))
console.log(JSON.stringify(_.chunk(['a', 'b', 'c', 'd'], 0)))
commented
const chunk = (arr, size = 1, cache = []) => {
  const temp = [...arr]
  if (size <= 0) {
    return cache
  }
  while(temp.length) {
    cache.push(temp.splice(0, size))
  }
  return cache
}

function chunk(arr, num) {
if (Object.prototype.toString.call(arr) !== '[object Array]') {
throw new Error('arr类型不正确')
}
if (Object.prototype.toString.call(num) !== '[object Number]') {
throw new Error('num类型不正确')
}
if (num <= 0) {
throw new Error('num 数值不正确')
}
let temp = [];
while (arr.length > 0) {
temp.push(arr.splice(0, num));
}
return temp;
}

commented
function Loadsh() {}

Loadsh.prototype.chunk = function chunk() {
  let input = arguments[0],
      size = arguments[1],
      length = input.length,
      to = []

  if (size == 0) return to;

  while (length >= size) {
    to.push(input.splice(0, size))
    length = input.length
  }

  if (length && length < size) {
    to.push(input)

    return to
  }

  return to
}

const _ = new Loadsh()

console.log(_.chunk(['a', 'b', 'c', 'd'], 2))
console.log(_.chunk(['a', 'b', 'c', 'd'], 3))
console.log(_.chunk(['a', 'b', 'c', 'd'], 5))
console.log(_.chunk(['a', 'b', 'c', 'd'], 0))
//[ [ 'a', 'b' ], [ 'c', 'd' ] ]
//[ [ 'a', 'b', 'c' ], [ 'd' ] ]
//[ [ 'a', 'b', 'c', 'd' ] ]
//[]

const _ = {
  chunk(input, index) {
    if (!index) {
      return [];
    }
    const temp = [];
    for (let i = 0, len = input.length; i < len; i += index) {
      temp.push(input.slice(i, i + index));
    }
    return temp;
  },
};


_.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)
// => []
const _ = {
  /**
   * 
   * @param {待分割数组} array 
   * @param {分割块大小} size 
   */
  chunk: (array, size) => {
    if(!Array.isArray(array)){
      return null
    }
    if(size <= 0 || array.length <= size) {
      return array
    }

    let result = []
    let rem = array.length % size
    let i = 0
    while(i != array.length - rem) {
      result.push(array.slice(i, i+size))
      i += size
    }
    if(rem != 0) {
      result.push(array.slice(-rem))
    }

    return result
  }
}
console.log(_.chunk(['a', 'b', 'c', 'd'], 5))
const chunk = (inputArr: any[], chunkSize: number) => {
    if (chunkSize === 0) {
        console.log('result: ', [])
        return []
    }
    let result = []
    let index = 0
    const inputArrLength = inputArr.length
    while(index < inputArrLength) {
        const item = inputArr.slice(index, index + chunkSize)
        result.push(item)
        index += chunkSize
    }
    console.log('result: ', result)
    return result
}

const _ = {
    chunk,
}

/**
 * @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)
// => []

打印结果:
image

const _ = {
chunk: function(arr, target) {
if (target === 0) {return []}
let result = []
let i = 0, len = arr.length
while(i<len) {
result.push(arr.slice(i, i+target))
i += target
}
return result
}
}

// chunk函数根据size参数将第一个array数组参数分组,剩下的如果不足则size个数也会被分成一组
// size如果为0则返回空数组
let _ = {}
_.chunk  = function (arr,size=0) {
if(!(arr instanceof Array)) return console.log('请传入一个数组!')
if(arr.length === 0) return[]
if(arr.length<= size) return arr
let result = []
while (arr.length){
    result.push(arr.splice(0,size))
}
return result
}
var _ = {
	chunk: (arr, size) =>{
		if (size === 0) {
			return [];
		}
		var filter = arr.filter((item, index) =>{
				return index < size
			});
		return size >= arr.length 
		?	[filter] 
		: 	[filter, arr.slice(size, arr.length)]
	}
}

console.log(_.chunk(['a', 'b', 'c', 'd'], 2));
console.log(_.chunk(['a', 'b', 'c', 'd'], 3));
console.log(_.chunk(['a', 'b', 'c', 'd'], 5));
console.log(_.chunk(['a', 'b', 'c', 'd'], 0));
function chunk(arr,num){
            if(!Array.isArray(arr)){
                throw new Error("请传入数组");
            }
            const len = arr.length;
            if(num <= 0){
                return []
            }
            const r1 = arr.slice(0,num)
            const r2 = arr.slice(num,len);
            return r2.length > 0 ? [r1,r2] : [r1]
        }
function chunk(nums, count) {
    if (Array.isArray(nums) && nums.length > 0) {
        if (count === 0) return [];

        let result = [], start = 0;
        while (nums.length > start) {
            result.push(nums.slice(start, (start += count)));
        }
        return result;
    } else {
        return false;
    }
}
function chunk(arr, size) {
  if (arr.length === 0 || size === 0) {
    return [];
  }
  let resArr = [];
  arr.forEach((item, index) => index % size === 0 ? resArr.push([item]) : resArr[resArr.length - 1].push(item));
  return resArr;
}

splice能改变原数组利用这个特性去实现的

// 单独实现方法 一行代码
function chunk(array, num) {
  return num > 0
    ? Array.from(new Array(Math.ceil(array.length / num))).map(() =>
        array.splice(0, num)
      )
    : [];
}

chunk([1, 2, 3, 4, 5], 2);

// 符合题的示例解法
class LodashFn {
  constructor() {}
  chunk(array, num) {
    return num > 0
      ? Array.from(new Array(Math.ceil(array.length / num))).map(() =>
          array.splice(0, num)
        )
      : [];
  }
}

const _ = new LodashFn();

_.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);
// => []

chunk 函数接受两个参数:

  • 第一个:待分块的数组;

  • 第二个:每块的长度。
    该函数将数组按照长度分块,如果剩余的元素数量不足一块,则按照一块处理。

    我的思路 使用splice 删除每次返回的的项目数组添加进 结果数组,(splice 会改变原数组),while进行判断 只要arr具有长度,就不断将要删除的元素数组push到结果中。

      let _ = {};
      _.chunk = function (arr, size) {
        if (!Array.isArray(arr)) {
          return [];
        }
        if (size === 0) {
          return [];
        }
        let result = [];
        while (arr.length) {
          result.push(arr.splice(0, size));
        }
        return result;
      };
      console.log(_.chunk(["a", "b", "c", "d"], 2));
      console.log(_.chunk(["a", "b", "c", "d"], 3));
      console.log(_.chunk(["a", "b", "c", "d"], 5));
      console.log(_.chunk(["a", "b", "c", "d"], 0));
      console.log(_.chunk(["a", "b", "c", "d", "e"], 2));

另外 上面最后一个console 加一个测试用例
Uploading image.png…

commented
function _chunk(arr, size) {
  if (!Array.isArray(arr)) return
  if (!size) return []
  if (arr.length <= size) return arr
  let result = []
  let chunkArr = []
  for (let i = 0; i < arr.length; i++) {
    if (i !== 0 && !(i % size))  {
      result.push(chunkArr)
      chunkArr  = []
    }
    chunkArr.push(arr[i])
    if  (i === arr.length - 1) {
      result.push(chunkArr)
      return result
    }
  }
  return result
}
function fn(){
  
  // 感觉像纯考数学题,考察处理边界问题
  this.chunk=function(array,number){
    let newArray=[];
    if(number===0){
      return newArray;
    }
    array.forEach((item,index)=>{
      if(!array[index*number]) return
      newArray.push(array.slice(index*number,(index+1)*number))
    })
    console.log(newArray)
    return newArray
  }
  
}


const demoFn=new fn()
demoFn.chunk(['a', 'b', 'c', 'd'], 4)

chunk 函数接受两个参数:

第一个:待分块的数组;

第二个:每块的长度。
该函数将数组按照长度分块,如果剩余的元素数量不足一块,则按照一块处理。

我的思路 使用splice 删除每次返回的的项目数组添加进 结果数组,(splice 会改变原数组),while进行判断 只要arr具有长度,就不断将要删除的元素数组push到结果中。

  let _ = {};
  _.chunk = function (arr, size) {
    if (!Array.isArray(arr)) {
      return [];
    }
    if (size === 0) {
      return [];
    }
    let result = [];
    while (arr.length) {
      result.push(arr.splice(0, size));
    }
    return result;
  };
  console.log(_.chunk(["a", "b", "c", "d"], 2));
  console.log(_.chunk(["a", "b", "c", "d"], 3));
  console.log(_.chunk(["a", "b", "c", "d"], 5));
  console.log(_.chunk(["a", "b", "c", "d"], 0));
  console.log(_.chunk(["a", "b", "c", "d", "e"], 2));

另外 上面最后一个console 加一个测试用例

那你个改变原数组了

commented
 const chunk = (input, size)=>{
     if(!input || !Array.isArray(input) || size<=0)
     return [];
    //  if(size > input.length) return input;
    const result = [];
    let childArr = [];
    input.forEach((item,index)=>{
        if((index + 1)%size === 1){
            childArr = []
        }
        childArr.push(item)
        if((index + 1)%size === 0 || index===input.length-1){
            result.push(childArr)
        }
    })
    
    return result
 }
 const chunk1 = (input, size)=>{
    if(!input || !Array.isArray(input) || size<=0)
    return [];
    const result = [];
    let start = 0;
    while(start<input.length){
        result.push(input.slice(start, start+size));
        start += size
    }
    console.log(result)
    return result;
 }
commented
function chunk(arr, count) {
  if (!Array.isArray(arr)) {
    console.error(`${arr} must be array`);
    return;
  }
  if (typeof count !== 'number') {
    console.error(`${count} must be number`);
    return;
  }
  if (count === 0) {
    return [];
  }
  const len = arr.length;
  const result = [];
  for(let i = 0; i < Math.ceil(len / count); i++) {
    result.push(arr.splice(0, count))
  }
  return result;
}
commented
不修改原数组 splice
const chunk2 = (input, size)=>{
    if(!input || !Array.isArray(input) || size<=0)
    return [];
    const result = [];
    let start = 0;
    const orginArr = [...input];
    while(orginArr.length){
        result.push(orginArr.splice(0, size));
    }
    console.log(result)
    return result;
 }

const chunk = (arr, chunkSize) => arr.reduce((pre, cur, index) => index % chunkSize === 0 ?
[...pre, [cur]] : [...pre.slice(0, pre.length - 1), [...pre[pre.length - 1], cur] ], [])

commented
const chunk = (array, size) => {
    if (!array || !Array.isArray(array) || size < 1) return []
    return array.reduce((prev, curr, index) => {
        if (index % size === 0) {
	    prev.push([curr])
		return prev
	}
       const temporary = prev[prev.length - 1]
       temporary && temporary.push(curr)
       return prev
    }, [])
}
const chunk = (list, ln) => {
  if (ln <= 0) return [];
  const result = [];
  list.forEach((item, index) => {
    const mol = index % ln, idx = Math.floor(index / ln);
    if (mol === 0) result[idx] = [];
    result[idx].push(item);
  });
  return result;
};

function main() {
  const chunks = (input, size) => {
    size = Math.max(parseInt(size), 0);
    if (!Array.isArray(input)) {
      return [];
    }
    if (size < 1) {
      return [];
    }
    if (size > input.length) {
      return [...input];
    }
    return [input.slice(0, size), input.slice(size, input.length)];
  };
  return {
    chunks,
  };
}
const _ = main();
const res = _.chunks(["a", "b", "c", "d"], 3);
console.log(res);
function chunk(arr, len) {
  if(len === 0) return [];

  let [start, end, res] = [0, len, []];
  while(start < arr.length) {
    res.push(arr.slice(start, end));
    [start, end] = [end, end+len];
  }
  return res;
}

function chunk(arr, step) {
if (!Array.isArray(arr) || !step) return []
let newArr = []
let data = [...arr]
while (data.length > 0) {
newArr.push(data.splice(0, step))
}
return newArr
}

const _chunk = (chunker, size) => {
  let result = [];
  if (size === 0) return [];
  while (chunker.length > size) {
    const s = chunker.splice(0, size);
    result = [...result, s];
  }
  if (chunker.length < size) return [...result, chunker];
};
commented
const _ = {
  chunk(list, size) {
    if(size < 1) return []
    const arr = [...list]
    const target = []
    while (arr.length){
      target.push(arr.splice(0, size))
    }
  }
}
commented
chunk=(arr,length)=>{
    let i =0
    let arr1= []
    while(i<arr.length){
        arr1.push(arr.slice(i,i+length));
        i=i+=length
    }
    return arr1
}
function chunk(array=[], size=1) {
  size = Math.max(toInteger(size),0)
  if(!Array.isArray(array)){
    return []
  }
  if(size < 1){
    return []
  }
  let begin = 0
  let len = array.length
  let arr = []
  while(begin < len){
    arr.push(array.slice(begin, begin+size))
    begin += size
  }
  return arr
}
const chunk = (arr, n) => {
  let len = arr.length;
  if (len === 0 || n === 0) return [];
  let res = [];
  let g = Math.floor(len / n);
  while(g) {
    res.push(arr.splice(0, n));
    g--;
  }
  return res;
}
const _ = {}
_.chunk = (arr, size) =>
    arr.reduce((prev,cur,idx)=> {
        idx%size == 0 ? prev.push([cur]) : prev[prev.length-1].push(cur)
        return prev
}, [])
console.log(_.chunk([1,2,3,4,5],2)) // [ [ 1, 2 ], [ 3, 4 ], [ 5 ] ]
console.log(_.chunk([1,2,3,4,5],4)) // [ [ 1, 2, 3, 4 ], [ 5 ] ]
function chunk(array = [], size = 0) {
    return size === 0 ? [] : new Array(Math.ceil(array.length / size)).fill(0).map((item, index) => {
       return array.slice(index * size, (index + 1) * size);
    });
}