Javascript:跳过数组中的每第4项?

时间:2014-12-07 03:18:01

标签: javascript arrays p5.js

我有一个完整的像素颜色值的数组顺序排列(R,G,B,A,R,G,B,A ......等),我试图通过它们改变值对于R,G和B,但我想单独留下A.什么是特别跳过数组第4(或第n)值的最佳方法?

我想做的事情:

  • 对于每一帧,将第一个R值(数组中的第一项)增加1。
  • 在R值中从0到255。
  • 当R = 255时,将其重置为0并将G值(数组中的第2项)增加1.
  • R继续循环,从0到255,每次增加G,直到:
  • 当G = 255时,将其重置为0并将B值(第3项)增加1.
  • 同样的事情,G循环每次增加B一次。
  • 当B =​​ 255时,将其重置为0并跳过 A值(第4项!),而是增加下一个R值,即第5项。然后无限期地继续这个广告直到阵列结束。

我正在处理的项目是在P5.js中,但我认为这个问题更具体针对Javascript。

谢谢大家!

ETA:由于人们在问我在这里使用的是什么,你可以去:

var m = 0;
var array = [0];

function draw() {
  var last = array[array.length-1];

  loadPixels();
  pixels[array[last]] += 1;
  updatePixels();

  if (pixels[array[last]] == 255) {
    loadPixels();
    pixels[array[last]] = 0;
    updatePixels();
    m += 1;
    array.push(m);
  }
}

这似乎工作得很接近,我可以看到像素循环通过颜色,但随后它们很快变白(可能是因为if语句在循环通过它后将A值重置为零。虽然我仍然希望保持所有像素的移动(有点像我在列表中所描述的那样),而不仅仅是做一个然后继续下一个。

我原本没有包含这个,因为我仍然是Javascript的新手,并且意识到我的工作到目前为止可能是如此深奥的自我引导,我担心大多数人都无法做出正面或反面它的。但是如果可以的话,我想更好。

4 个答案:

答案 0 :(得分:3)

您可以使用模运算非常简洁地执行此操作:

var myPixels = [255, 255, 255, 0.5, 255, 189, 22, 0.3];

function updatePixels(pixels) {
    var shouldContinue = true,
        i = 0;

    for ( ; i < pixels.length && shouldContinue; i += 1) {
        // Skip every 4th index
        if (i % 4 !== 3) {
            pixels[i] = (pixels[i] + 1) % 256;

            // keep going as long as the current RGB value has just been reset to 0
            shouldContinue = (pixels[i] === 0);
        }
    }
}

// EXAMPLE USAGE    
console.log(myPixels);
updatePixels(myPixels);
console.log(myPixels);
updatePixels(myPixels);
console.log(myPixels);

运行时,会产生输出:

[255, 255, 255, 0.5, 0, 189, 22, 0.3]
[0, 0, 0, 0.5, 0, 190, 22, 0.3]
[1, 0, 0, 0.5, 0, 190, 22, 0.3]

答案 1 :(得分:1)

  

特别跳过数组第4(或第n)值的最佳方法是什么?

我们的想法是创建一个for循环,并将i作为索引,并检查i % 4 != 3是否为真。下面的代码将跳过数组的第4项,其中n是一个正整数。

var arr = ['R', 'G', 'B', 'A', 'R', 'G', 'B', 'A', 'R', 'G', 'B', 'A', 'R', 'G', 
           'B', 'A', 'R', 'G', 'B', 'A','R'];

for (i = 0; i < arr.length; i++) {
    if (i % 4 != 3) {
        alert(arr[i]); // will display only R, G, and B

        // do your thing here for R, G, and B
    }
}

字符串元素仅用于示例。您可以使用数组更改arr并使用相同的for循环。

工作演示:http://jsfiddle.net/o7epn1cb/

答案 2 :(得分:1)

使用关键字continue跳过迭代:

for(var i = 0; i < ary.length; i++) {
    if(i % 4 === 3) {
        continue; // this keyword means skip following steps, jump to next iteration
    }
    // work to do
}

答案 3 :(得分:0)

在数组循环逻辑上跳过4,然后RGB上的三个嵌套循环做你想做的事,见下文:

P.S。由于我的回答错误地被拒绝了,我添加了一个示例数组和一个console.log消息,为您提供一个完整的工作示例,您可以在节点或浏览器中运行它以查看它正在执行OP所要求的内容。

var a=[0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4];
    for(i=0;i<a.length;i+=4) // notice the i+=4 instead of i++, this the trick.
    {
      for(b=0;b<256;b++) {
        for(g=0;g<256;g++) {
          for(r=0;r<256;r++) {
            a[i]=r; // R cycles from 0 to 255 
            console.log(i, a[i], a[i+1], a[i+2]);
          }
          a[i+1]=g; // G cycles from 0 to 255
        }
        a[i+2]=b; // B cycles from 0 to 255
      }
    }