Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中如何循环访问数组_Javascript_Arrays_Loops_Circular Buffer - Fatal编程技术网

JavaScript中如何循环访问数组

JavaScript中如何循环访问数组,javascript,arrays,loops,circular-buffer,Javascript,Arrays,Loops,Circular Buffer,我有一个类似于[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 } var arr=[A,B,C,D]; var len=arr.len; 对于(var i=0;i尝试以下方法: var arr = ["A","B","C","

我有一个类似于
[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
}
var arr=[A,B,C,D];
var len=arr.len;
对于(var i=0;i尝试以下方法:

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());
}
var arr=[“A”、“B”、“C”、“D”];
for(var i=0,len=arr.length;i
for(var i=0;i
只需使用模运算符,就可以以循环方式访问数组

var arr=['A','B','C','D'];
对于(变量i=0,len=arr.length;i}
我做的这条班轮怎么样

var nextItem = (list.indexOf(currentItem) < list.length - 1)
                        ? list[list.indexOf(currentItem) + 1] : list[0];
var nextItem=(list.indexOf(currentItem)
用于“就地”循环移位的单线解决方案:

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
日志:

如果只需要前3项,请使用:

arr.forEach((x,i,t) => {console.log(i,t.slice(0, 3)); t.push(t.shift());});

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

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

let val = arr[(i % n + n) % n];
这个小技巧是必要的——有些人不能直接使用模结果——因为JavaScript总是将模运算计算为被除数(第一个操作数)和除数(第二个操作数)之间除法的剩余部分分离它们的符号,但将被除数的符号分配给其余部分。这种行为并不总是产生所需的模运算“环绕”效果,并可能导致错误访问数组的负位置

有关更多信息,请参阅:

  • 其他解决方案:

    var arr=['A','B','C','D'];
    var nextVal=函数(arr){
    返回arr[((nextVal.counter<(arr.length-1))?++nextVal.counter:nextVal.counter=0));
    };
    
    对于(var i=0;你认为循环列表是解决这个问题的一种方法吗?@JoãoRamires你应该使用getTime/setTime来回答你自己的问题。请看我的答案,这种方法会为每个班次创建一个数组。如果有一个像slice这样的函数,它环绕并取一定的长度,例如
    array.circslice(start,len)
    [1,3,4].cirSlice(3,5)
    结果
    [4,1,3,4,1]
    ?可以。但这不提供源数组的环绕切片。它也会因负数而失败;例如
    [1,2,3]
    开始=1
    ,`len=-3`=>
    [2,1,3]
    。我不明白。(负数作为数组长度?)你能重新表述一下你想指出的吗?为什么不让val=arr[Math.abs(i%n)];
    ?不幸的是,这对
    i
    的负值不起作用。结果——除法的剩余部分——将与模运算的预期结果不同。例如,在JS
    (-1%10+10)中%10
    计算结果为
    9
    ,但
    Math.abs(-1%10)
    计算结果为
    1
    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"]
    
    arr.forEach((x,i,t) => {console.log(i,t.slice(0, 3)); t.push(t.shift());});
    
    let val = arr[(i % n + n) % n];