如何为所有对象设置类别
How to set a category to all objects
我有固定数量的类别:
1, 2 and 3
我的数组中有 N 个元素。
我想设置每个元素的类别,其中前三分之一 = 3,第二个三分之一 = 2,最后三分之一 = 1。
我正在使用这个简陋的代码:
for(let i = 0; i < data.length / 3 - 1; i++) // set first 3rd
data[i].category = 3;
for(let j = parseInt(data.length / 3); j < (data.length * 2)/3 - 1; j++) // set 2nd third
data[i].category = 2;
for(let k = parseInt((data.length * 2)/3); k < data.length; k++) // set 3rd third
data[i].category = 1;
但这并不能给出准确的结果,尤其是当 N < 3 时。
如果 N < 3,我想要:
If N=1, set it to 3
If N=2, set first element to 3, second to 2
If N=3, set first to 3, second to 2 and third to 1
If N=4, set first to 3, second to 2 and last two to 1
If N=5, set first to 3, second two to 2, last two to 1
If N=6, split to three thirds and assign a category to each couple
.. etc
所以如果 N 是奇数,则最后一项属于类别 = 1(最后一个类别)...等等。但混淆是当 N 是奇数且 N-1 不能被 3 整除(示例 N=11:我会希望前 3 个为 3,然后 4 个为 2,最后 4 个为 1)。或者当 N 是偶数但不能被 3 整除时(例如 N=8:我希望第一个 2 为 3,然后 3 为 2,最后 3 个为 1)
我怎样才能做到这一点?解决方案可以使用任何编程语言,然后我会将其转换为 javascript
也许 Python 的这一点会有所帮助:
def f(n):
q,r = divmod(n,3) #quotient and remainder
a = q
b = q + (1 if r == 2 else 0)
c = q + (1 if r > 0 else 0)
return (a,b,c)
像这样使用:
>>> for N in range(1,15): print(N, "=>",f(N))
1 => (0, 0, 1)
2 => (0, 1, 1)
3 => (1, 1, 1)
4 => (1, 1, 2)
5 => (1, 2, 2)
6 => (2, 2, 2)
7 => (2, 2, 3)
8 => (2, 3, 3)
9 => (3, 3, 3)
10 => (3, 3, 4)
11 => (3, 4, 4)
12 => (4, 4, 4)
13 => (4, 4, 5)
14 => (4, 5, 5)
请注意 (1 if r == 2 else 0)
类似于 C 语法语言中的 r == 2 ? 1 : 0
。
输出(i,j,k)
的解释是数组中的前i
个元素设置为等于3
,接下来的j
个元素设置为等于2
和最后的 k
个元素设置为等于 3
。您的问题似乎是如何获得这种拆分方式 N
.
您可以对小数组进行校正并计算所需部分的值。
var array = [
[1],
[1, 2],
[1, 2, 3],
[1, 2, 3, 4],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 6, 7],
[1, 2, 3, 4, 5, 6, 7, 8],
],
result = array.map(aa => aa.map(
(_, i, a) => (a.length < 3 && 3 - a.length) + (i < Math.floor(a.length / 3) ? 3 : 1 + (i < Math.floor(2 * a.length / 3)))
));
console.log(result.map(a => JSON.stringify(a)));
.as-console-wrapper { max-height: 100% !important; top: 0; }
我有固定数量的类别:
1, 2 and 3
我的数组中有 N 个元素。
我想设置每个元素的类别,其中前三分之一 = 3,第二个三分之一 = 2,最后三分之一 = 1。
我正在使用这个简陋的代码:
for(let i = 0; i < data.length / 3 - 1; i++) // set first 3rd
data[i].category = 3;
for(let j = parseInt(data.length / 3); j < (data.length * 2)/3 - 1; j++) // set 2nd third
data[i].category = 2;
for(let k = parseInt((data.length * 2)/3); k < data.length; k++) // set 3rd third
data[i].category = 1;
但这并不能给出准确的结果,尤其是当 N < 3 时。
如果 N < 3,我想要:
If N=1, set it to 3
If N=2, set first element to 3, second to 2
If N=3, set first to 3, second to 2 and third to 1
If N=4, set first to 3, second to 2 and last two to 1
If N=5, set first to 3, second two to 2, last two to 1
If N=6, split to three thirds and assign a category to each couple
.. etc
所以如果 N 是奇数,则最后一项属于类别 = 1(最后一个类别)...等等。但混淆是当 N 是奇数且 N-1 不能被 3 整除(示例 N=11:我会希望前 3 个为 3,然后 4 个为 2,最后 4 个为 1)。或者当 N 是偶数但不能被 3 整除时(例如 N=8:我希望第一个 2 为 3,然后 3 为 2,最后 3 个为 1)
我怎样才能做到这一点?解决方案可以使用任何编程语言,然后我会将其转换为 javascript
也许 Python 的这一点会有所帮助:
def f(n):
q,r = divmod(n,3) #quotient and remainder
a = q
b = q + (1 if r == 2 else 0)
c = q + (1 if r > 0 else 0)
return (a,b,c)
像这样使用:
>>> for N in range(1,15): print(N, "=>",f(N))
1 => (0, 0, 1)
2 => (0, 1, 1)
3 => (1, 1, 1)
4 => (1, 1, 2)
5 => (1, 2, 2)
6 => (2, 2, 2)
7 => (2, 2, 3)
8 => (2, 3, 3)
9 => (3, 3, 3)
10 => (3, 3, 4)
11 => (3, 4, 4)
12 => (4, 4, 4)
13 => (4, 4, 5)
14 => (4, 5, 5)
请注意 (1 if r == 2 else 0)
类似于 C 语法语言中的 r == 2 ? 1 : 0
。
输出(i,j,k)
的解释是数组中的前i
个元素设置为等于3
,接下来的j
个元素设置为等于2
和最后的 k
个元素设置为等于 3
。您的问题似乎是如何获得这种拆分方式 N
.
您可以对小数组进行校正并计算所需部分的值。
var array = [
[1],
[1, 2],
[1, 2, 3],
[1, 2, 3, 4],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 6, 7],
[1, 2, 3, 4, 5, 6, 7, 8],
],
result = array.map(aa => aa.map(
(_, i, a) => (a.length < 3 && 3 - a.length) + (i < Math.floor(a.length / 3) ? 3 : 1 + (i < Math.floor(2 * a.length / 3)))
));
console.log(result.map(a => JSON.stringify(a)));
.as-console-wrapper { max-height: 100% !important; top: 0; }