web-dev-qa-db-ja.com

JavaScript配列はインデックスからの開始を減らします

この問題はしばらくの間私を悩ませてきました、そして私はウェブで答えを見つけることができないようです。

特定のインデックスから配列reduceメソッドを使用することは可能ですか?

簡単な例

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 ...
}

しかし、すべての整数の合計を整数カウントで割った平均評点を取得する必要があるとしましょう。配列に整数のみが含まれている場合は、reduceを使用しても問題はありません。

var onlyIntegersArr = [5,2,3,4];
var averageGrade = onlyIntegersArr.reduce(function(a,b){
  return a + b;
}) / onlyIntegersArr.length;

ただし、何らかの理由で最初の2つの配列要素をスキップし、インデックスArray [2]から開始する必要があることがわかっている場合。

したがって、たとえば、reducestudentGradesに適用しますが、インデックスstudentGrades [2]からのみ適用します。

reduceでそれは可能ですか?

解決策をありがとう、私はsliceアプローチが好きですが、この場合は新しい方法を使用したくないです。

例えば.

var average = studentGrades.reduce(function(a,b,i){
  return i >= 2 ? a+b : 0;
}) / (studentGrades.length - 2);
11
JanisSt

reduce の3番目の引数はインデックスです。これが fiddle です。

var averageGrade = onlyIntegersArr.reduce(function (a, b, c) {
    if (c >= 2) {
        return a + b;
    } else {
        return 0;
    }
});

配列の2番目のインデックスの後に数値以外の項目が多い場合は、これを確認してください fiddle

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);
6
gurvinder372

最初の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;
8
Jaromanda X

常にインデックス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;
0
mavili

なぜあなたは物事を過度に複雑にするのですか?何故なの:

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;
}

たぶん、すべての成績が別々の配列にあるオブジェクトにデータを保持することを考える必要があります。そして、他のデータはプロパティにあります。所有している配列からシリアル化して、オブジェクトを操作できます。

0
mindarelus