javascript - 将数组拆分为 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 项 :( 请帮我弄清楚如何实现它,使用伪代码也很好!谢谢!
解决方案
如果我理解正确,您希望将您的输入分成 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]
因为这样就没有机会通过改变返回的数组来改变原始数组,反之亦然。但这对您来说可能不是问题。
推荐阅读
- javascript - 如何在使用 React 和 JS 的测验应用程序中清楚地显示多个单击选项?谢谢
- c# - 如何在没有存储库的情况下设置 MOQ?System.NullReferenceException: '对象引用未设置为对象的实例
- php - Making a query on a table that has json field and postgresql database and laravel
- sql - 我在更新我的 SQL 表时包含了值,但 SQL 仍然将我的值视为“无”??(如果我正确收到错误消息)
- java - 我只是想知道下面代码中 readInput() 的功能
- python - 用不同的语法调用超类
- proxy - LoadRunner 不记录本地主机的事件
- python - 使用多个字典在python中编写一个csv文件
- r - 将 t 检验结果列表转换为数据框
- java - 为什么我的 Kafka 生产者无法发布消息?