我有以下JS代码,它应返回数组中的第一个和最后一个项目,然后从其余项目中增加。
例如:
var numbers = ['One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten'];
var values = [];
values.push(numbers[0]); // get first
values.push(numbers[numbers.length-1]); // get last
numbers = numbers.slice(1, numbers.length-1); // remove the first and last from numbers
console.log(numbers); // (numbers will go from 2-9 now)
var interval = 2;
for (var i = interval; i < numbers.length; i+=interval) { // get every 2nd item
values.push(numbers[i]);
}
console.log(values);
返回:
["One", "Ten", "Four", "Six", "Eight"]
所以重新订购给了我:
["One", "Four", "Six", "Eight", "Ten"]
但是如果数据集改为Eleven,那么最终结果将是:
["One", "Eleven", "Four", "Six", "Eight", "Ten"]
重新订购:
["One", "Four", "Six", "Eight", "Ten", "Eleven"]
所以问题在于Ten
和Eleven
彼此相邻,而不是与其他项目相等。
我能想到避免这种情况的唯一方法是检查数组的长度,看看它是否为偶数,然后在这种情况下将间隔增加为奇数。 e.g。
if (interval % 2 != 0)
interval = interval + 1;
然而,我发现有时你仍然可以在最后一个项目旁边找到一个项目,如果数学计算结果与列表中的其他项目不相同,因为在执行切片之后,第二个项目数组中的最后一项现在是最后一项,所以如果循环间隔最终与此索引完全匹配,则最终会得到该项。
我该如何避免这种情况?基本上总是选择第一个和最后一个项目,然后在中间按照我可以通过的给定间隔填充项目。
答案 0 :(得分:1)
你可以计算获得等间距数组的索引。
function getValues(array, count) {
var last = array.pop(),
values = [];
for (i = 0; i < count - 1; i++) {
values.push(array[Math.floor(i * array.length / (count - 1))]);
}
return values.concat(last);
}
console.log(getValues(['One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten'], 5));
console.log(getValues(['One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven'], 5));
对于真正相同的距离分布,您可以查看euclidean algorithm,或者更好地使用bjorklunds algorithm,它会在项目周围平均插入空格。更受欢迎的标题是euclideans rhythm。
答案 1 :(得分:-1)
您需要指定目标是什么。看起来你想要均匀间隔的值,包括第一个和最后一个项目,但你还没有正式指定这个,你还没有说出由于某种原因是否优先选择2的间隔。