如何根据 people 数组长度的可分值准备数组?
How to prepared array based on dividable value from length of people array?
下面是一组人员 ID
var arrPeopleIDs = [1,2,3,4,5];
我想把它分成 N 或更少的组,从数组的末尾开始。
人数:5
除法:single/double (N = 2)
- 1 键单用 1
- 1 键与 2,3
加倍
- 1 键双 4,5
// Below output expected
var arrResult = [
[1], [2,3], [4,5]
];
人数:5
划分:single/double/三重 (N = 3)
- 1 键与 1,2
加倍
- 3,4,5 的 1 个键
// Below output expected
var arrResult = [
[1,2], [3,4,5]
];
人数:5
除法:single/double/三重/四重 (N = 4)
- 1键单用1
- 1 个键用于 2,3,4,5
四边形
// Below output expected
var arrResult = [
[1], [2,3,4,5]
];
有人可以帮我实现预期的输出吗?
提前致谢!
创建一个接受值数组、大小数组和基于该数组的块的函数相当简单。
function chunkLargest(arr, chunks) {
let currentChunk = chunks.pop();
let r = [];
arr.reverse();
while (arr.length > 1) {
if (currentChunk > arr.length) {
currentChunk = chunks.pop();
}
r.push(arr.splice(0, currentChunk));
}
return r.reverse().map(e => e.reverse());
}
console.log(chunkLargest([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 3]));
.as-console-wrapper { max-height: 100% !important; top: auto; }
工作原理:
首先,将起始块大小(chunks
数组的最后一个值)与pop
一起修改数组,并定义一个结果数组。然后当原始数组仍然有元素时循环,检查是否需要更改块大小,然后对数组进行分块。
如果你希望它是可重用的,以确保原始数组不被修改,你可以在函数内部使用浅拷贝:
function chunkLargest(a, chunks) {
let arr = [...a];
let currentChunk = chunks.pop();
let r = [];
arr.reverse();
while (arr.length > 1) {
if (currentChunk > arr.length) {
currentChunk = chunks.pop();
}
r.push(arr.splice(0, currentChunk));
}
return r.reverse().map(e => e.reverse());
}
const arrPeopleIDs = [1, 2, 3, 4, 5, 6, 7, 8];
console.log(chunkLargest(arrPeopleIDs, [1, 2, 3]));
.as-console-wrapper { max-height: 100% !important; top: auto; }
像这样分块时只会有一个余数,所以你可以安全地分块数组,然后添加余数,如果有的话:
var arrPeopleIDs = [1, 2, 3, 4, 5, 6];
const chunk = (arr, d) => {
const temp = arr.slice()
const out = []
const rem = temp.length % d
while (temp.length !== rem) out.unshift(temp.splice(temp.length - d, d))
rem && out.unshift(temp.splice(0, rem))
return out
}
console.log(chunk(arrPeopleIDs, 1))
console.log(chunk(arrPeopleIDs, 2))
console.log(chunk(arrPeopleIDs, 3))
console.log(chunk(arrPeopleIDs, 4))
console.log(chunk(arrPeopleIDs, 5))
上面是一个函数,它将接受一个数组和一个数字(块的最大大小)和 return 一个分块数组,从数组末尾的最大块开始,然后是开始时的剩余部分。这个函数不会修改原来的数组-所以可以多次调用
下面是一组人员 ID
var arrPeopleIDs = [1,2,3,4,5];
我想把它分成 N 或更少的组,从数组的末尾开始。
人数:5
除法:single/double (N = 2)
- 1 键单用 1
- 1 键与 2,3 加倍
- 1 键双 4,5
// Below output expected
var arrResult = [
[1], [2,3], [4,5]
];
人数:5
划分:single/double/三重 (N = 3)
- 1 键与 1,2 加倍
- 3,4,5 的 1 个键
// Below output expected
var arrResult = [
[1,2], [3,4,5]
];
人数:5
除法:single/double/三重/四重 (N = 4)
- 1键单用1
- 1 个键用于 2,3,4,5 四边形
// Below output expected
var arrResult = [
[1], [2,3,4,5]
];
有人可以帮我实现预期的输出吗?
提前致谢!
创建一个接受值数组、大小数组和基于该数组的块的函数相当简单。
function chunkLargest(arr, chunks) {
let currentChunk = chunks.pop();
let r = [];
arr.reverse();
while (arr.length > 1) {
if (currentChunk > arr.length) {
currentChunk = chunks.pop();
}
r.push(arr.splice(0, currentChunk));
}
return r.reverse().map(e => e.reverse());
}
console.log(chunkLargest([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 3]));
.as-console-wrapper { max-height: 100% !important; top: auto; }
工作原理:
首先,将起始块大小(chunks
数组的最后一个值)与pop
一起修改数组,并定义一个结果数组。然后当原始数组仍然有元素时循环,检查是否需要更改块大小,然后对数组进行分块。
如果你希望它是可重用的,以确保原始数组不被修改,你可以在函数内部使用浅拷贝:
function chunkLargest(a, chunks) {
let arr = [...a];
let currentChunk = chunks.pop();
let r = [];
arr.reverse();
while (arr.length > 1) {
if (currentChunk > arr.length) {
currentChunk = chunks.pop();
}
r.push(arr.splice(0, currentChunk));
}
return r.reverse().map(e => e.reverse());
}
const arrPeopleIDs = [1, 2, 3, 4, 5, 6, 7, 8];
console.log(chunkLargest(arrPeopleIDs, [1, 2, 3]));
.as-console-wrapper { max-height: 100% !important; top: auto; }
像这样分块时只会有一个余数,所以你可以安全地分块数组,然后添加余数,如果有的话:
var arrPeopleIDs = [1, 2, 3, 4, 5, 6];
const chunk = (arr, d) => {
const temp = arr.slice()
const out = []
const rem = temp.length % d
while (temp.length !== rem) out.unshift(temp.splice(temp.length - d, d))
rem && out.unshift(temp.splice(0, rem))
return out
}
console.log(chunk(arrPeopleIDs, 1))
console.log(chunk(arrPeopleIDs, 2))
console.log(chunk(arrPeopleIDs, 3))
console.log(chunk(arrPeopleIDs, 4))
console.log(chunk(arrPeopleIDs, 5))
上面是一个函数,它将接受一个数组和一个数字(块的最大大小)和 return 一个分块数组,从数组末尾的最大块开始,然后是开始时的剩余部分。这个函数不会修改原来的数组-所以可以多次调用