在数组中向前和向后选择 X 个金额,如果需要,循环到开头和结尾

Select X amount forward and backwards in an array, looping to beginning and end if needed

本文关键字:如果 结尾 开头 循环 数组 选择 金额      更新时间:2023-09-26

我需要,给定一个数组索引和一个范围,在返回新索引的数组中向前循环 X 金额和向后循环 X 金额。

如果循环继续到达数组的末尾,它将在数组的开头继续。如果循环在向后到达开头,则在数组的末尾继续。

例如,对于数组:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

给定索引为 8 且范围为 3,该函数将返回[5, 6, 7 ,8, 9, 0, 1]

或者,给定索引为 1,范围为 3,它将返回 [8, 9, 0, 1, 2, 3, 4]

我尝试编写一个解决方案,但它仅适用于固定范围的数字,而且非常粗糙。只是想知道是否有一种简洁的方法可以实现这一目标。首选Javascript解决方案,但如果需要,我很乐意从另一种语言翻译逻辑。

谢谢。

使用模数非常简单:

var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    index = 8,
    n = 3;
var result = [];
for (var i = index - n, len = array.length; i <= index + n; i++) {
    result.push(array[(i + len) % len]);
}
console.log(result);

编辑 JSFiddle: http://jsfiddle.net/cmymS/

此示例中取模运算符的说明:

模运算符处理越过边界。在 for 循环中,i 是数组中的"虚拟"索引,可以小于 0 或 >= len 。您可以将其视为在实际数组的左侧和右侧无限重复数组。如果i < 0,我们将访问左侧的虚拟阵列之一,如果i >= len,我们将访问右侧的虚拟阵列之一。然后,索引转换(i + len) % len处理将"虚拟"索引转换回实际数组索引。

有两个边界条件和访问"正常"索引的情况:

a) i < 0:考虑例如 i = -3 .

(i + len)会将位置移动一个完整的数组,以便我们在右侧的虚拟数组中工作,但指向相同的元素。模量没有影响,因为len - 3小于len

b) i >= len:考虑例如 i = len + 4

(i + len)会将位置向右移动一个数组。在我们的示例中,(i + len)将是(len + 4 + len)但模中和了这些偏移,因此我们得到了4

c) i是原始数组中的有效索引 (i + len)会将位置向右移动一个数组,但这是由自 0 <= i < len 年以来的模数重置的。 (i + len) % len = i .

function carousel(array, index, n) {
    var result = [];
    for (var i = index - n, len = array.length; i <= index + n; i++) {
        result.push(array[i < 0 ? len + i : i > len - 1 ? i - len : i]);
    }
    return result;
}
// TEST
var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    index = 8,
    n = 3;
console.log(carousel(array, index, n));

演示:http://jsfiddle.net/SUGhf/

我正在寻找可以给我同样的东西的东西,但不仅使用数组中的索引,而且使用可以无穷大的任意位置(即 +100 - 100),所以我只是在本例中在上面的代码中添加了一行 -12。如果有人需要它。

function carousel(array, arbitraryIndex, n) {
var result = [];
index = arbitraryIndex % (array.length);
for (var i = index - n, len = array.length; i <= index + n; i++) {
    result.push(array[i < 0 ? len + i : i > len - 1 ? i - len : i]);
}
return result;
}
var array = [0, 1, 2, 3, 4, 5],
arbitraryIndex = -12,
n = 3;
console.log(carousel(array, arbitraryIndex, n));