我有一个像[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中访问它,任何想法?
答案 0 :(得分:14)
试试这个:
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(","));
答案 1 :(得分:10)
只需使用模数运算符,您就可以循环方式访问数组。
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('****')
}
答案 2 :(得分:3)
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(','));
}
答案 3 :(得分:2)
我制作的这种单线程怎么样?
var nextItem = (list.indexOf(currentItem) < list.length - 1)
? list[list.indexOf(currentItem) + 1] : list[0];
答案 4 :(得分:1)
回答了主要问题,有人可以使用模块化算术以循环方式访问数组。可以使用JavaScript的模运算符(%
)和解决方法来实现。
给出长度为arr
并存储在其中的值n
的数组val
,该数组将通过访问索引i
,循环方式且更安全地获得不考虑i
的值和符号而访问数组的方式是:
let val = arr[(i % n + n) % n];
这个小技巧是必要的-某些人不能直接使用模数结果-因为JavaScript始终将模数运算作为除数(第一个操作数)和除数(第二个操作数)之间除法的余数,从而忽略了它们的符号但将剩余的分配给剩余的符号。这种行为并不总是会导致模块化算术产生所需的“环绕”效果,并且可能导致错误地访问数组的负位置。
更多信息参考:
答案 5 :(得分: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"]
如果只需要前三个项目,请使用:
arr.forEach((x,i,t) => {console.log(i,t.slice(0, 3)); t.push(t.shift());});
答案 6 :(得分: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));
}
并基于模数:
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));
}