我得到一个数据未知的数组。 但我只有一个预定义的数据要显示/存储。 如何获取初始数组的每个第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,我的工作方式相同,但每一个元素都采用该方法。我该怎么做才能让它发挥作用?
答案 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);
} );
如果您希望ratio
为arr
的1/2,则oldArr
为2;如果您希望oldArr
为ratio = 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))]