Javascript:取每个数组元素

时间:2015-11-02 16:53:19

标签: javascript arrays

我得到一个数据未知的数组。 但我只有一个预定义的数据要显示/存储。 如何获取初始数组的每个第n个元素并在JavaScript中减少它?

例如:我得到一个大小= 10000的数组,但只能显示n = 2k个元素。

我试过这样: 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;
  });
}

0.2总是0,但是有一些其他的增量(0.3)它正在工作。对于delta = 0.4,我的工作方式相同,但每一个元素都采用该方法。我该怎么做才能让它发挥作用?

5 个答案:

答案 0 :(得分:27)

也许有一个解决方案:

避免过滤,因为你不想循环超过10 000个元素! 只需使用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);

答案 1 :(得分:9)

过滤器本身返回一个数组。如果我正确理解你,你不需要那个周围的循环。所以:

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

将newArr设置为oldArr中的每三个值。

答案 2 :(得分:2)

尝试

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

如果您希望ratioarr的1/2,则oldArr为2;如果您希望oldArrratio = Math.ceil(oldArr.length / size); // size in the new `arr` size 的1/3,则{3}等等

filter()

您在循环内的oldAdd的每个元素上调用filter(),并且您应该在整个数组上调用 var zipcode = '27560'; var appid = '96afa96cadeb7165258ae95b77fdc'; var startdate = '2015-09-01'; var enddate = '2015-09-30'; var timeperiod ='24'; var dataUrl = '//api.worldweatheronline.com/premium/v1/past-weather.ashx?q='+ zipcode +'&format=json&date='+ startdate +'&enddate='+ enddate +'&tp='+ timeperiod +'&key='+ appid var dataUrl2 = '//westbrookfl.com/wp-content/plugins/CSAnalytics/lib/data/data-GoalValueTotals.php' //Creates Table for Citation Data $.when( $.getJSON(dataUrl), $.getJSON(dataUrl2) ).done (function (data, data2) { var data = data[0].data; console.log(data, data2); var citationHTML = ''; var channelHTML = ''; jQuery.each(data, function (i) { var weather = data.weather; for (var i = 0; i < weather.length; ++i) { citationHTML += '<li id="day'+[i]+'" class="day"><div class="date">' + weather[i].date + '</div><div class="svg-icon"><img src="' + weather[i].hourly[0].weatherIconUrl[0].value + '" /></div><div class="data-wrap col2"><p class="data hi-temp"><span>' + weather[i].maxtempF + '</span><sup class="deg ng-scope" data-ng-if="hasValue()">°</sup></p><p class="data lo-temp"><span>' + weather[i].mintempF + '</span><sup class="deg ng-scope" data-ng-if="hasValue()">°</sup></p></div><p class="data desc">' + weather[i].hourly[0].weatherDesc[0].value + '</p></li>'; } }) jQuery.each(data2[0], function (i, item) { channelHTML += '<tr><td class="tg-yw4l">' + item.date + '</td><td class="tg-yw4l">' + (+item.goalConversionRateAll).toFixed(2) + '%</td><td class="tg-yw4l">' + item.goalCompletionsAll + '</td><td class="tg-yw4l">$' + item.goalvalueall + '</td></tr>'; }) jQuery('#citation_report').append(citationHTML); jQuery('#channeldata_table').append(channelHTML); }); 以获取新的过滤后的数组。

答案 3 :(得分:0)

@anonomyous0day's solution借入,使用给定数组中的所需索引生成一个新的Array

(每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

答案 4 :(得分:0)

这也可以通过使用 map 创建新数组而不迭代旧数组中的所有元素来实现..

df = df[~((df.name == 'marcus') & (df.present == False))]