14

我有一个像[A,B,C,D]. 我想在 for 循环中访问该数组,例如

var arr = [A,B,C,D];

var len = arr.len;
for(var i = 0;i<arr.len;i++){
    0 - A,B,C
    1 - B,C,D
    2 - C,D,A
    3 - D,A,B
}

我想像在 JavaScript 中一样访问它,有什么想法吗?

4

7 回答 7

33

回答主要问题,有人可以使用模运算以循环方式访问数组。这可以在 JavaScript 中使用模运算符 ( %) 和一种解决方法来实现。

arr给定一个长度数组n和一个val存储在其中的值,将通过访问索引获得i,循环方式和更安全的方式访问数组,忽略 的值和符号i,将是:

let val = arr[(i % n + n) % n];

这个小技巧是必要的——有人不能直接使用取模结果——因为 JavaScript 总是将取模运算评估为被除数(第一个操作数)和除数(第二个操作数)之间除法的余数,不考虑它们的符号但分配给余数是股息的符号。该行为并不总是导致模运算的所需“环绕”效果,并且可能导致对数组负位置的错误访问。

更多信息参考:

  1. https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/what-is-modular-arithmetic
  2. https://en.wikipedia.org/wiki/Modular_arithmetic
  3. https://en.wikipedia.org/wiki/Modulo_operation
  4. https://dev.to/maurobringolf/a-neat-trick-to-compute-modulo-of-negative-numbers-111e
于 2019-01-29T18:05:05.507 回答
15

尝试这个:

var arr = ["A","B","C","D"];
for (var i=0, len=arr.length; i<len; i++) {
    alert(arr.slice(0, 3).join(","));
    arr.push(arr.shift());
}

如果不改变数组,它将是

for (var i=0, len=arr.length; i<len; i++) {
    var str = arr[i];
    for (var j=1; j<3; j++)
        str += ","+arr[(i+j)%len]; // you could push to an array as well
    alert(str);
}
// or
for (var i=0, len=arr.length; i<len; i++)
    alert(arr.slice(i, i+3).concat(arr.slice(0, Math.max(i+3-len, 0)).join(","));
于 2013-07-05T07:18:21.167 回答
9

只需使用模数运算符,您就可以以循环方式访问数组。

var arr = ['A', 'B', 'C', 'D'];

for (var i = 0, len = arr.length; i < len; i++) {
  for (var j = 0; j < 3; j++) {
    console.log(arr[(i + j) % len])
  }
  console.log('****')
}

于 2014-09-03T17:12:39.537 回答
2
for (var i = 0; i < arr.length; i++) {
    var subarr = [];
    for (var j = 0; j < 3; j++) {
        subarr.push(arr[(i+j) % arr.length]);
    }
    console.log(i + " - " + subarr.join(','));
}
于 2013-07-05T07:23:54.740 回答
2

我做的这个单线怎么样?

var nextItem = (list.indexOf(currentItem) < list.length - 1)
                        ? list[list.indexOf(currentItem) + 1] : list[0];
于 2016-03-31T13:57:55.387 回答
0

“就地”循环移位的一种解决方案:

const arr = ["A","B","C","D"];
arr.forEach((x,i,t) => {console.log(i,t); t.push(t.shift());});
console.log("end of cycle", arr); // control: cycled back to the original

日志:

0 Array ["A", "B", "C", "D"]
1 Array ["B", "C", "D", "A"]
2 Array ["C", "D", "A", "B"]
3 Array ["D", "A", "B", "C"]
"end of cycle" Array ["A", "B", "C", "D"]

如果您只想要前 3 个项目,请使用:

arr.forEach((x,i,t) => {console.log(i,t.slice(0, 3)); t.push(t.shift());});
于 2019-01-22T14:08:54.290 回答
0

另一个解决方案:

    var arr = ['A','B','C','D'];
    var nextVal = function (arr) {        
        return arr[( ( ( nextVal.counter < ( arr.length - 1 ) ) ? ++nextVal.counter : nextVal.counter=0  )   )];
    };

    for(var i=0;i<arr.length;i++){
        console.log(nextVal(arr)+','+nextVal(arr)+','+nextVal(arr));
    }

并基于 Modulo :

var arr = ['A','B','C','D'];
var len = arr.length;

var nextVal = function (arr, dir = 1) { 
        if ( dir < 0 ) { nextVal.counter--;}
        let i = (nextVal.counter % len + len) % len;  
        if ( dir > 0 ) { nextVal.counter++; }
        return arr[i];
};

nextVal.counter=0;
for(var i=0;i<arr.length;i++){
    console.log(nextVal(arr)+','+nextVal(arr)+','+nextVal(arr));
}

// in reverse 
console.log('-------------------');
nextVal.counter=0;
for(var i=0; i<10; i++) {
    console.log(nextVal(arr, -1)+','+nextVal(arr, -1)+','+nextVal(arr, -1));
}

于 2021-02-05T11:23:43.237 回答