我有一个字符串数组(分数形式的分数),例如[“ 40/60”,“ 30/40”,...]。分数代表用户对问题的回答,数组是给定类别的所有回答。
我想拆分字符串,将每个字符串解析为一个整数,然后在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
等...
那为什么不能将总数相加呢?我如何解决它?是由于范围?
谢谢!
答案 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
函数,您可以使用它节省一些开销:)