-
我有一系列字符串(以分数的形式编写的分数(,例如[40/60" 30/40&quot",...]。分数代表用户对问题的回答,数组是给定类别的所有回答。
-
我想将字符串拆分,每个分析到整数中,然后在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);
}
结果是:
array [45&quot;&quot'60']
nan
nan
array [60&quot'60']
nan
nan
array [40&quot" 40"
nan
nan
etc
但是,当自己打印出解析的整数时,它已经正确解析了...
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);
}
这导致..
array [45&quot;&quot'60']
45
60
array [60&quot'60']
60
60
array [40&quot" 40"
40
40
等...
那么,为什么我不能将总计添加在一起呢?我如何解决它?是由于范围吗?
谢谢!
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);
}
我认为.dreduce函数在这里是一个不错的选择:(
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);
如果您有可用的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
功能,您可以用来节省一些开销:(