如何拆分字符串数组,将字符串数字解析为整数,然后将其添加到for循环中

时间:2019-05-13 14:01:46

标签: javascript arrays for-loop split parseint

  1. 我有一个字符串数组(分数形式的分数),例如[“ 40/60”,“ 30/40”,...]。分数代表用户对问题的回答,数组是给定类别的所有回答。

  2. 我想拆分字符串,将每个字符串解析为一个整数,然后在for循环中添加每个左侧分数以获取用户的总类别得分,并添加每个右侧分数以获取一个总可能最高分。

我已经尝试了下面的代码,并重新获得了NaN。

################
var scoreArray = ["45/60", "60/60", "40/40","30/40", "15/20", "30/40", "30/60", "20/40"];

var i;

var myCategoryScore;

var maxCategoryScore;
################

for(i=0; i < scoreArray.length;i++){

    var splitScore = scoreArray[i].split("/");
    console.log(splitScore);

    myQuestionScore = parseInt(splitScore[0], 10);
    myCategoryScore = myCategoryScore + myQuestionScore;
    console.log(myCategoryScore);

    maxQuestionScore = parseInt(splitScore[1]);
    maxCategoryScore = maxCategoryScore + maxQuestionScore; 
    console.log(maxCategoryScore);
}

打印结果为:

  

数组[“ 45”,“ 60”]

     

NaN

     

NaN

     

数组[“ 60”,“ 60”]

     

NaN

     

NaN

     

数组[“ 40”,“ 40”]

     

NaN

     

NaN

     

但是,当仅打印出自己解析的整数时,它们显然已经被正确解析了...

for(i=0; i<scoreArray.length;i++){

   var splitScore = scoreArray[i].split("/");
   console.log(splitScore);

   myQuestionScore = parseInt(splitScore[0], 10);
   console.log(myQuestionScore);

   maxQuestionScore = parseInt(splitScore[1]);
   console.log(maxQuestionScore);
}

这导致..

  

数组[“ 45”,“ 60”]

     

45

     

60

     

数组[“ 60”,“ 60”]

     

60

     

60

     

数组[“ 40”,“ 40”]

     

40

     

40

     

等...

那为什么不能将总数相加呢?我如何解决它?是由于范围?

谢谢!

3 个答案:

答案 0 :(得分:2)

myCategoryScore从未初始化。

myCategoryScore = myCategoryScore + myQuestionScore;将提供undefined + 42 //NaN

maxCategoryScore

相同

如何重现您的错误:

var UndefinedValue;

console.log(UndefinedValue);

console.log(UndefinedValue + 42);

初始化变量,以便可以在数学运算中使用它们:

var scoreArray = ["45/60", "60/60", "40/40","30/40", "15/20", "30/40", "30/60", "20/40"];

var i;
// initialize this one
var myCategoryScore = 0;
// and this one
var maxCategoryScore = 0;


for(i=0; i < scoreArray.length;i++){

    var splitScore = scoreArray[i].split("/");
    console.log(splitScore);

    myQuestionScore = parseInt(splitScore[0], 10);
    myCategoryScore = myCategoryScore + myQuestionScore;
    console.log(myCategoryScore);

    maxQuestionScore = parseInt(splitScore[1]);
    maxCategoryScore = maxCategoryScore + maxQuestionScore; 
    console.log(maxCategoryScore);
}

答案 1 :(得分:1)

我认为.reduce函数将是一个不错的选择:)

var scoreArray = ["45/60", "60/60", "40/40","30/40", "15/20", "30/40", "30/60", "20/40"];
var scoreArrayParsed = scoreArray.reduce((acc, e) => {
    let arr = e.split('/');

    acc.min += parseInt(arr[0]);
    acc.max += parseInt(arr[1]);

    return acc;
}, {
    min: 0,
    max: 0
});

console.log(scoreArrayParsed);

答案 2 :(得分:0)

如果有可用的破折号,可以使用_.zip

以一种凉爽(或令人作呕的)单行方式进行拆分步骤
  

创建一个分组元素的数组,其中第一个包含给定数组的第一个元素,第二个包含给定数组的第二个元素,依此类推。

_.zip(['a', 'b'], [1, 2], [true, false]);
// => [['a', 1, true], ['b', 2, false]]

您可以尝试以下方法:

const _ = require('lodash');
const scoreArray = ["45/60", "60/60", "40/40","30/40", "15/20", "30/40", "30/60", "20/40"];
const sortedScores = _.zip(..._.map(scoreArray, s => s.split('/')));

// [ [ '45', '60', '40', '30', '15', '30', '30', '20' ],
//   [ '60', '60', '40', '40', '20', '40', '60', '40' ] ]

第一个数组具有第一个值,第二个数组具有第二个值!之后,您可以继续使用reduce,如其他答案所示。 Lodash还提供了_.sum函数,您可以使用它节省一些开销:)