Как разбить массив строк, разобрать номера строк как целые числа и сложить их вместе в цикле for - PullRequest
0 голосов
/ 13 мая 2019
  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);
}

Выведен следующий результат:

Array["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);
}

Это приводит к ..

Array ["45", "60 "]

45

60

Массив [" 60 "," 60 "]

60

60

Массив ["40", "40"]

40

40

и т. Д.

Так почему я могуне суммировать вместе?Как мне это исправить?Это из-за объема?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 мая 2019

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 голос
/ 13 мая 2019

Я думаю, что функция .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);
0 голосов
/ 13 мая 2019

Если у вас есть доступный 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, которую вы можете использовать для экономии накладных расходов:)

...