【问题标题】:How to split an array of strings, parse the string numbers as integers and add them together in a for loop如何拆分字符串数组,将字符串数字解析为整数并将它们添加到 for 循环中
【发布时间】:2019-05-13 14:01:45
【问题描述】:
  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

等等……

那么为什么我不能把总数加在一起呢?我如何解决它?是因为范围吗?

谢谢!

【问题讨论】:

  • 您正在执行myCategoryScore = myCategoryScore + myQuestionScore;myCategoryScore 被声明为undefined。 (var myCategoryScore; // myCategoryScore === undefined)

标签: javascript arrays for-loop split parseint


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我认为 .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);
    

    【讨论】:

      【解决方案3】:

      如果您有可用的 lodash,您可以使用 _.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 函数,您可以使用它来节省一点开销:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-21
        • 2012-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-01
        相关资源
        最近更新 更多