首页 > 解决方案 > 将数组拆分为 20 项部分,并将剩余部分拆分为 vanillaJS

问题描述

我需要从我的函数中得到这样的结果:

if arr.length == 65
then the splittedarr will be : [[obj 1, obj 2, obj 3.... obj 4 ... obj 20], [obj 21 .. obj 40], 
[obj 41 ... obj 65]]

在 vanillaJS 中,这将被设置为反应钩子的变量,这是我的代码

useEffect(() => {
    setSplitted([]);
    const foundCopy = found.slice();
    let i = 0;
    if(!found[i + 20]) {
      console.log("I", i)
      let mutablecopy = foundCopy.slice();
      return setSplitted(curr => [...curr, mutablecopy.splice(i, found.length - i)])
    }
    while(foundCopy[i + 20]) {
      console.log("I", i)
      let mutablecopy = foundCopy.slice();
      console.log(mutablecopy)
      setSplitted(curr => [...curr, mutablecopy.splice(i, i + 20)]);
      i += 20;
    }
    
  }, [found]);

我当前的代码给了我两个相同的数组,每个数组 20 项 :( 请帮我弄清楚如何实现它,使用伪代码也很好!谢谢!

标签: javascriptarraysreactjsalgorithmreact-hooks

解决方案


如果我理解正确,您希望将您的输入分成 20 个组,但如果最后一个完整组不足以使最后一个更大。

这个递归版本应该这样做:

const chunk = (n) => (xs) =>
  xs .length <= 2 * n ? [[...xs]] : [xs.slice(0, n), ... chunk (n) (xs .slice (n))]

const input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65]

console .log (chunk(20) (input))
.as-console-wrapper {max-height: 100% !important; top: 0}

我们只是测试我们是否有足够多的项目用于单个组。如果我们这样做,我们将采用其中的第一个n并将其与再次调用的结果与n其余元素相同。

我通常使用的版本n不是2 * n. 改变是让你的最后一组比其他组长。我通常希望它更短。(1-20、21-40、41-60、61-65。)我更喜欢这样[[...xs]]做,[xs]因为这样就没有机会通过改变返回的数组来改变原始数组,反之亦然。但这对您来说可能不是问题。


推荐阅读