Массив 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;
}

Возможно, вам нужно подумать о сохранении данных в объекте, где все оценки находятся в отдельном массиве. И другие данные будут в свойствах. Вы можете сериализовать его из имеющегося массива, а затем работать с объектом.