从数组

时间:2016-11-02 17:35:04

标签: javascript arrays

我有以下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"]

所以问题在于TenEleven彼此相邻,而不是与其他项目相等。

我能想到避免这种情况的唯一方法是检查数组的长度,看看它是否为偶数,然后在这种情况下将间隔增加为奇数。 e.g。

if (interval % 2 != 0)
    interval = interval + 1;

然而,我发现有时你仍然可以在最后一个项目旁边找到一个项目,如果数学计算结果与列表中的其他项目不相同,因为在执行切片之后,第二个项目数组中的最后一项现在是最后一项,所以如果循环间隔最终与此索引完全匹配,则最终会得到该项。

我该如何避免这种情况?基本上总是选择第一个和最后一个项目,然后在中间按照我可以通过的给定间隔填充项目。

2 个答案:

答案 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的间隔。