Javascript - сумма массива равна NaN - PullRequest
0 голосов
/ 08 мая 2020

Я вычисляю 4 самых больших числа в моем массиве следующим образом:

let topArr = data.map(e => Number(e.replace(/(,\s*)+/g, '').trim()))
    .sort((a, b) => {
        return b - a
    })
    .slice(0, 4)
    .map((item) => {
        return String(item).replace(/(.)(?=(\d{3})+$)/g, '$1,')
    });

console.log // Array(4) [ "195,918", "171,749", "167,076", "116,486" ]

Сейчас я пытаюсь вычислить сумму этих 4 чисел в массиве, используя .reduce в своей попытке, но я я получаю возврат NaN, вот мой код:

let sum = topArr.reduce(function (a, b) {
    return a + b;
}, 0);

Я также не заметил, чтобы эти числа были превращены в строку чисел, поэтому попытался преобразовать их в целые числа с помощью let sumArr = topArr.map(Number);, который также возвращает NaN. Я ожидаю, что общая сумма для 4 чисел в моем массиве будет равна 651,229

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

Запятых нет в JavaScript числах - плюс, в конце цепочки функций topArr вы все конвертируете обратно в строку. Чтобы наилучшим образом сохранить существующий код, я просто добавил ваше регулярное выражение замены строки запятой в reduce:

const data = ["195,918", "171,749", "167,076", "116,486"]

let topArr = data.map(e => Number(e.replace(/(,\s*)+/g, '').trim()))
  .sort((a, b) => {
    return b - a
  })
  .slice(0, 4)
  .map((item) => {
    return String(item).replace(/(.)(?=(\d{3})+$)/g, '$1,')

  });

let sum = topArr.reduce((a, b) => a + Number(b.replace(/(,\s*)+/g, '').trim()), 0);

console.log(topArr);
console.log(sum);

Однако это решение более эффективно, так как оно удаляет обратное преобразование в строку в конце topArr:

const data = ["195,918", "171,749", "167,076", "116,486"]

let topArr = data.map(e => Number(e.replace(/(,\s*)+/g, '').trim()))
  .sort((a, b) => {
    return b - a
  });

let sum = topArr.reduce((a, b) => a + b, 0);

console.log(topArr);
console.log(sum);

Как видите, оба они производят одинаковый (правильный) результат.

0 голосов
/ 08 мая 2020

Это можно сделать sh следующим образом:

const numbers = [100, 1274, 55, 83, 21, 8, 1000, 62]
const sortedNumbers = numbers.sort((a, b) => b - a)
const sum = sortedNumbers.slice(0, 4).reduce((a, b) => a + b)
console.log(sum)

Сначала мы сортируем ваш числовой массив в порядке убывания. Затем мы знаем, что первые четыре элемента массива являются четырьмя наибольшими числами, поэтому мы выполняем нашу операцию сокращения для numbers.slice(0, 4).

Если список состоит из строк, а не целых чисел, вы можете изменить код как таковой:

const numbers = ["100", "1,274", "55", "83", "21", "8", "1000", "62"]
intNumbers = []
numbers.forEach((n) => intNumbers.push(parseInt(n.replace(/,/g, ""))))
const sortedNumbers = intNumbers.sort((a, b) => b - a)
const sum = sortedNumbers.slice(0, 4).reduce((a, b) => a + b)
console.log(sum)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...