如何为所有对象设置类别

How to set a category to all objects

提问人:Sandra K 提问时间:9/27/2017 最后编辑:CommunitySandra K 更新时间:9/27/2017 访问量:40

问:

我有固定数量的类别:

1、2 和 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,我想要:

如果 N=1,则将其设置为 3

如果 N=2,则将第一个元素设置为 3,将第二个元素设置为 2

如果 N=3,则将 first 设置为 3,将 second 设置为 2,将 second 设置为 1

如果 N=4,则将 first 设置为 3,将 second 设置为 2,将 last 2 设置为 1

如果 N=5,则将 first 设置为 3,将 second 设置为 2,将 last 2 设置为 1

如果 N=6,则拆分为三分之二,并为每对分配一个类别

..等

因此,如果 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

JavaScript 与语言无关

评论

0赞 John Coleman 9/27/2017
您的条件似乎被低估了。我不明白你说的“等等”是什么意思。例如,N = 7 是否应该映射到 3332211 或 3322211 或 3322111?或。。。?
0赞 Sandra K 9/27/2017
@JohnColeman我对你最后一个问题的回答非常灵活,如果代码“更干净”,N=7 可以是任何(3332211 或 3322211 或 3322111),>更易于阅读和处理

答:

1赞 John Coleman 9/27/2017 #1

也许这点 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)

请注意,这与 C 语法语言类似。(1 if r == 2 else 0)r == 2 ? 1 : 0

输出的解释是数组中的第一个元素设置为等于,下一个元素设置为等于,最后一个元素设置为等于。你的问题似乎是如何获得这种分裂方式.(i,j,k)i3j2k3N

评论

0赞 John Coleman 9/27/2017
divmod同时计算整数商和余数,so 和q = int(n/3)r = n%3
2赞 Nina Scholz 9/27/2017 #2

您可以对小数组进行校正并计算所需部分的值。

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