在数组中向前和向后选择 X 个金额,如果需要,循环到开头和结尾
Select X amount forward and backwards in an array, looping to beginning and end if needed
我需要,给定一个数组索引和一个范围,在返回新索引的数组中向前循环 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));
- 如果 a 为 false,则 if(a) === if(false)
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如果文本字段为空,则使用JavaScript应用CSS样式
- 如果我在javascript中输入无效的电子邮件或空白,如何显示特定的文本框边框红色
- 如果href包含X,请更改href
- 如果localstorage为空,则显示欢迎消息
- 点击后隐藏潜水?(但如果Div是一面旗帜呢?)
- 如果元素's的ID以数字开头
- 如果数字以1结尾,做点什么
- 如果网址以“lang=fr”结尾,如何更改网站语言
- 在数组中向前和向后选择 X 个金额,如果需要,循环到开头和结尾
- 如果文本以这些字符开头或结尾,请删除字符
- 获取 window.location.href 以返回页面名称和扩展名(如果 URL 以 / 斜杠结尾)
- 替换<a>如果它以字符串JQuery结尾
- 如果字符串包含所有汉字或以汉字结尾,请检查JavaScript/jQuery
- 如何从字符串的开头和结尾删除所有符号(如果有的话)?
- 如果前一页url以“-cn”结尾,则更改当前页面的内容
- 如果字符串的开头或结尾字符在正则表达式中没有匹配