简体   繁体   English

Javascript:取数组的第n个元素

[英]Javascript: take every nth Element of Array

I get an Array with an unknown Number of data.我得到一个数据数量未知的数组。 But I only have an predefined amount of data to be shown/store.但我只有预定义数量的数据要显示/存储。 How can I take every nth Element of the initial Array and reduce it in JavaScript?如何获取初始数组的每个第 n 个元素并将其减少到 JavaScript?

Eg.: I get an Array with size=10000, but are only able to show n=2k Elements.例如:我得到一个大小为 10000 的数组,但只能显示 n=2k 个元素。

I tried it like that: delta= Math.round(10*n/size)/10 = 0.2 -> take every 5th Element of the initial Array.我是这样尝试的:delta= Math.round(10*n/size)/10 = 0.2 -> 取初始数组的第 5 个元素。

for (i = 0; i < oldArr.length; i++) {
  arr[i] = oldArr[i].filter(function (value, index, ar) {
    if (index % delta != 0) return false;
    return true;
  });
}

With 0.2 it´s always 0, but with some other deltas (0.3) it is working.对于 0.2,它始终为 0,但对于其他一些增量 (0.3),它可以正常工作。 Same for delta=0.4, i works, but every second Element is taken with that.与 delta=0.4 相同,我可以工作,但是每隔一个 Element 都会被带走。 What can I do to get this to work?我该怎么做才能让它发挥作用?

Maybe one solution :也许一种解决方案:

avoid filter because you don't want to loop over 10 000 elements !避免使用过滤器,因为您不想循环超过 10 000 个元素! just access them directly with a for loop !只需使用 for 循环直接访问它们!

 var log = function(val){document.body.innerHTML+='<div></pre>'+val+'</pre></div>'} var oldArr = [0,1,2,3,4,5,6,7,8,9,10] var arr = []; var maxVal = 5; var delta = Math.floor( oldArr.length / maxVal ); // avoid filter because you don't want // to loop over 10000 elements ! // just access them directly with a for loop ! // | // V for (i = 0; i < oldArr.length; i=i+delta) { arr.push(oldArr[i]); } log('delta : ' + delta + ' length = ' + oldArr.length) ; log(arr);

Filter itself returns an array.过滤器本身返回一个数组。 If I'm understanding you correctly, you don't need that surrounding loop.如果我正确理解你,你不需要那个环绕的循环。 So:所以:

newArr = oldArr.filter(function(value, index, Arr) {
    return index % 3 == 0;
});

will set newArr to every third value in oldArr.将 newArr 设置为 oldArr 中每隔三个值。

Try尝试

arr = oldArr.filter(function (value, index, ar) {
    return (index % ratio == 0);
} );

where ratio is 2 if you want arr to be 1/2 of oldArr , 3 if you want it to be 1/3 of oldArr and so on.如果您希望arroldArr 1/2,则ratio为 2,如果您希望它为oldArr 1/3, oldArr ,依此类推。

ratio = Math.ceil(oldArr.length / size); // size in the new `arr` size

You were calling filter() on each element of oldAdd inside a loop and you're supposed to call filter() on the whole array to get a new filtered array back.您在循环内对oldAdd每个元素调用filter() ,并且您应该在整个数组上调用filter()以获取新的过滤数组。

Borrowing from @anonomyous0day's solution , generate a new Array with the desired indices from the given array:从借用@ anonomyous0day的溶液,生成一个新的Array与来自给定的阵列所需的索引:

(Take every 3 items) (每3件取一次)

Array.prototype.take = function(n) {
  if (!Number(n) && n !== 0) {
    throw new TypeError(`Array.take requires passing in a number.  Passed in ${typeof n}`);
  } else if (n <= 0) {
    throw new RangeError(`Array.take requires a number greater than 0.  Passed in ${n}`);
  }

  const selectedIndicesLength = Math.floor(this.length / n);
  return [...Array(selectedIndicesLength)].map((item, index) => this[index * n + 1]);
};

[1, 2, 3, 4, 5, 6, 7, 8].take(2); // => 2, 4, 6, 8

this also works by using map to create the new array without iterating over all elements in the old array..这也可以通过使用map创建新数组而不迭代旧数组中的所有元素来工作。

 // create array with 10k entries const oldArr = [ ...Array( 10000 ) ].map( ( _el, i ) => i ); const max = 10; const delta = Math.floor( oldArr.length / max ); const newArr = [ ...Array( max ) ].map( ( _el, i ) => ( oldArr[ i * delta ] ) ); console.log( newArr );

may help!可能会有所帮助!

 const myFunction = (a, n) => {

   let array = []


    for(i = n; i <= a.length; i += n){
      array.push(a[i-1]);

   }

  return array;

}

 function nthreturn(arr, n) { console.log(arr.slice(n, n + 1)); return arr; } nthreturn([1, 2, 3, 4, 5, 6, 7, 8], 2);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM