Массив JavaScript уменьшает начало от индекса
эта проблема меня уже некоторое время беспокоит, и я не могу найти ответ в интернете.
можно ли использовать метод уменьшения массива, начиная с определенного индекса?
простой пример:
var studentGrades = ["John Doe", "Some School", 6, 7, 8, 7, 9, 9];
если мне нужно перебирать только целые числа в studentGrades, я могу сделать это с помощью простого цикла for
for(var i = 2; i < studentGrades.length; i++) {
// do stuff here ...
}
но предположим, мне нужно будет получить среднюю оценку, которая является суммой всех целых чисел, разделенных на целые числа. Если Массив содержал только целые числа, тогда не было бы проблем с использованием уменьшить.
var onlyIntegersArr = [5,2,3,4];
var averageGrade = onlyIntegersArr.reduce(function(a,b){
return a + b;
}) / onlyIntegersArr.length;
однако если я знаю, что по каким-то причинам мне нужно пропустить первые два элемента массива и начать с индекса массива[2].
так, например, я бы применить уменьшить to studentGrades, но только начиная с индекса studentGrades[2].
это возможно с уменьшить?
спасибо решения, мне нравится slice подход, но я предпочитаю не использовать новый метод в данном случае.
например
var average = studentGrades.reduce(function(a,b,i){
return i >= 2 ? a+b : 0;
}) / (studentGrades.length - 2);
4 ответов
уменьшить3-й аргумент-это индекс, вот скрипка
var averageGrade = onlyIntegersArr.reduce(function (a, b, c) {
if (c >= 2) {
return a + b;
} else {
return 0;
}
});
если массив имеет больше нечисловых элементов после второго индекса, то проверьте это скрипка
var studentGrades = ["John Doe", "Some School", 6, 7, 8, 7, 9, 9, "Some School"];
var averageGrade = studentGrades.reduce(function (a, b, c) {
if (c >= 2 && !isNaN(b)) {
return a + b;
} else if (c >= 2) {
return a + 0;
} else {
return 0;
}
})
alert(averageGrade);
если вы точно знаете, что хотите пропустить первый n
элементы, вы можете использовать Array#slice
используя ES2015 Функции Стрелочку
var sum = array.slice(n).reduce((a, b) => a + b);
var studentGrades = ["John Doe", "Some School", 6, 7, 8, 7, 9, 9];
var sum = studentGrades.slice(2).reduce((a, b) => a + b);
document.body.innerHTML = 'SUM is = ' + sum;
в ES5 тот же код можно записать с помощью анонимной функции.
var sum = array.slice(n).reduce(function(a, b) {
return a + b;
});
var studentGrades = ["John Doe", "Some School", 6, 7, 8, 7, 9, 9];
var sum = studentGrades.slice(2).reduce(function(a, b) {
return a + b;
});
document.body.innerHTML = 'SUM is = ' + sum;
на случай, что вы упомянули, только сложение числовых значений, независимо от того, где в массиве они - можно сделайте что-нибудь вроде
var sum = array.reduce(function(result, v) {
return result + (parseFloat(v) || 0);
}, 0);
var studentGrades = ["John Doe", "Some School", 6, 7, 8, 7, 9, 9];
var sum = studentGrades.reduce(function(result, v) {
return result + (parseFloat(v) || 0);
}, 0);
document.body.innerHTML = 'SUM is = ' + sum;
Если вы уверены, что вам всегда нужен только индекс 2, то этого достаточно
var onlyIntegersArr = studentGrades.slice(2);
var averageGrade = onlyIntegersArr.reduce(function(a,b){
return a + b;
}) / onlyIntegersArr.length;
Если, однако, вы хотите получить все целые числа, то вам нужно отфильтровать массив
var onlyIntegersArr = studentGrades.filter(function(val) {
return (val === parseInt(val, 10));
});
var averageGrade = onlyIntegersArr.reduce(function(a,b){
return a + b;
}) / onlyIntegersArr.length;
почему вы все усложняете? Почему бы и нет:
function avg(arr)
{
var sum = 0;
var l = 0;
for(var i = 0; i < arr.length; i++)
{
if(isNaN(1*arr[i])) continue;
sum += arr[i];
l++;
}
return sum/l;
}
Возможно, вам нужно подумать о сохранении данных в объекте, где все оценки находятся в отдельном массиве. И другие данные будут в свойствах. Вы можете сериализовать его из имеющегося массива, а затем работать с объектом.