Javascript 相对地从数组中选取X值
我试图从数组中相对地选取X值。例如,我想从以下数组中选择4个值: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
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我知道,实际上我现在有点作弊。(我正确地更新了我的示例)。我想要实现的是在整个原始数组上分布值。这可能就是您想要实现的:完美!非常感谢。你知道这叫什么吗?我不知道如何搜索这个函数。这是某种映射还是你怎么称呼它?不客气。我想用“等间距”这样的术语,你会发现一些类似的问题。:-)这里有一些:,。太好了!非常感谢。你知道这叫什么吗?我不知道如何搜索这个函数。这是某种映射还是你怎么称呼它?不客气。我想用“等间距”这样的术语,你会发现一些类似的问题。:-)这里有几个:。