Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 相对地从数组中选取X值_Javascript_Arrays_Sorting - Fatal编程技术网

Javascript 相对地从数组中选取X值

Javascript 相对地从数组中选取X值,javascript,arrays,sorting,Javascript,Arrays,Sorting,我试图从数组中相对地选取X值。例如,我想从以下数组中选择4个值: arr = [1,2,3,4,5,6,7,8,9] 我现在做的是: var newArr = []; var pick = 4; var delta = arr.length/pick; for (i = 0; i < arr.length; i = i + delta) { k = Math.floor(i); newArr.push(arr[k]); }; // then I'm cheating

我试图从数组中相对地选取X值。例如,我想从以下数组中选择4个值:

arr = [1,2,3,4,5,6,7,8,9]
我现在做的是:

var newArr = [];
var pick = 4;
var delta = arr.length/pick;

for (i = 0; i < arr.length; i = i + delta) {
    k = Math.floor(i);
    newArr.push(arr[k]);
};

// then I'm cheating a bit
newarr[newArr.length-1] = arr[newArr.length-1];

我建议只使用从零到
pick
的计数器循环,并对每个元素进行乘法,得到计算整数值的索引

var arr=[1,2,3,4,5,6,7,8,9],
newArr=[],
pick=4,
delta=阵列长度/拾取,
i=0;
while(我控制台日志(newArr)
我建议只使用从零到
pick
的计数器循环,并对每个元素进行乘法,得到计算整数值的索引

var arr=[1,2,3,4,5,6,7,8,9],
newArr=[],
pick=4,
delta=阵列长度/拾取,
i=0;
while(我控制台日志(newArr)主要问题在这一行:

var delta = arr.length/pick;
使用这个delta值,您将使我在循环的最后一次迭代中得到值
arr.length
,它不是有效的索引。它应该(根据您的请求)到达数组的最后一个元素。此外,您还需要从第一个值开始,因此您的增量应该更大(间隔由pick-1部分确定),因此上面的语句应该是:

if (pick == 1) return [arr[0]]; // exceptional case
var delta = (arr.length-1)/(pick-1);
要处理浮点不准确的问题,最好使用
舍入
而不是
下限
,这样,如果在最后一次迭代中i的值比
arr.length-1
小一点,它仍然会以该索引为目标

为了绝对确保生成所需数量的值,应该将其计入循环条件

最后,您似乎还希望从数组中的第一个值开始,因此这意味着您不应该在拾取第一个值之前将增量添加到i值中

综上所述,您可以实现以下功能:

函数pickFrom(arr,pick){
if(pick==1)返回[arr[0]];//异常情况
var newArr=[];
变量增量=(arr.length-1)/(pick-1);
var k,i=0;
而(选择--){
k=数学圆(i);
新到达推力(arr[k]);
i=i+delta;
}
返回newArr;
}
var arr=[1,2,3,4,5,6,7,8,9]
var res=pickFrom(arr,4);
控制台日志(res)

.as控制台包装{max height:100%!important;top:0;}
主要问题如下:

var delta = arr.length/pick;
使用这个delta值,您将使我在循环的最后一次迭代中得到值
arr.length
,它不是有效的索引。它应该(根据您的请求)到达数组的最后一个元素。此外,您还需要从第一个值开始,因此您的增量应该更大(间隔由pick-1部分确定),因此上面的语句应该是:

if (pick == 1) return [arr[0]]; // exceptional case
var delta = (arr.length-1)/(pick-1);
要处理浮点不准确的问题,最好使用
舍入
而不是
下限
,这样,如果在最后一次迭代中i的值比
arr.length-1
小一点,它仍然会以该索引为目标

为了绝对确保生成所需数量的值,应该将其计入循环条件

最后,您似乎还希望从数组中的第一个值开始,因此这意味着您不应该在拾取第一个值之前将增量添加到i值中

综上所述,您可以实现以下功能:

函数pickFrom(arr,pick){
if(pick==1)返回[arr[0]];//异常情况
var newArr=[];
变量增量=(arr.length-1)/(pick-1);
var k,i=0;
而(选择--){
k=数学圆(i);
新到达推力(arr[k]);
i=i+delta;
}
返回newArr;
}
var arr=[1,2,3,4,5,6,7,8,9]
var res=pickFrom(arr,4);
控制台日志(res)

.as console wrapper{max height:100%!important;top:0;}
预期结果应该是以下之一。。。哪一个?为什么不检查一下
newarr.length说实话,我不明白你怎么会想到这些。。。你的代码应该并且确实会导致
newArr==[1,3,5,7]
你的新数组不可能比原来的数组长,因为你的
for
循环恰好迭代了n次,所以新数组中会有那么多元素。@JaromandaX我知道,实际上我现在有点作弊。(我正确地更新了我的示例)。我想要实现的是获得分布在整个原始数组上的值。这可能是您试图实现的:
预期结果应该是以下之一
。。。哪一个?为什么不检查一下
newarr.length说实话,我不明白你怎么会想到这些。。。你的代码应该并且确实会导致
newArr==[1,3,5,7]
你的新数组不可能比原来的数组长,因为你的
for
循环恰好迭代了n次,所以新数组中会有那么多元素。@JaromandaX我知道,实际上我现在有点作弊。(我正确地更新了我的示例)。我想要实现的是在整个原始数组上分布值。这可能就是您想要实现的:完美!非常感谢。你知道这叫什么吗?我不知道如何搜索这个函数。这是某种映射还是你怎么称呼它?不客气。我想用“等间距”这样的术语,你会发现一些类似的问题。:-)这里有一些:,。太好了!非常感谢。你知道这叫什么吗?我不知道如何搜索这个函数。这是某种映射还是你怎么称呼它?不客气。我想用“等间距”这样的术语,你会发现一些类似的问题。:-)这里有几个:。