【发布时间】:2016-05-17 11:56:00
【问题描述】:
我有一个数组和三个索引:
var arr = ['a', 'b', 'c', 'd'];
var f = 0; // first element
var l = arr.length - 1; // last element
var c = 0; // current element
我正在尝试编写一个使索引c 循环遍历数组的函数。要求是它永远不会达到索引l。因此,每当c 达到某个值时,f 和l 也需要增加。
我认为作为 c 限制的合理值是 f 和 l 之间的中点。我写的函数是这样的:
var mod = function(x, m) {
var r = x%m;
return r<0 ? r+m : r;
}
while (true) {
console.log('f', f, 'l', l, 'c', c);
if (c == l) {
console.log('error');
}
c = mod(c + 1, arr.length);
if (c > mod(l - f, arr.length) / 2) {
f = mod(f + 1, arr.length);
l = mod(l + 1, arr.length);
}
}
显然,它不起作用。是否有一个很好的简单公式来使用模运算符来获得我想要的东西,或者这种方法完全错误?
这是一个尝试的小提琴:https://jsfiddle.net/wku37h9e/2/
编辑:
解释这样做的目的会有点长。假设在数组中存储了我必须不断移动的外部元素的位置。当c 接近l 时,我推进所有索引。图形上会是这样的:
1. [f|c] [ ] [ ] [ l ]
2. [ f ] [ c ] [ ] [ l ]
3. [ l ] [ f ] [ c ] [ ] // here I start moving things around
4. [ ] [ l ] [ f ] [ c ]
5. [ c ] [ ] [ l ] [ f ]
6. [ f ] [ c ] [ ] [ l ]
等等。数组中的元素越多,索引之间的距离就会越大。
我还使用不同于普通版本的 mod 来考虑负数。
我希望现在清楚一点
【问题讨论】:
-
你为什么要这样做?请添加示例。
-
我添加了视觉解释
-
起始位置 1 和位置 5 导致不同的结果。
c的位置应该移动f和l吗? -
它应该是这样工作的。当
c与l太接近时,l会向前移动,f也会向前移动
标签: javascript arrays modulo