如何为所有对象设置类别

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; }