首页 > 解决方案 > Javascript - 数组的总和等于 NaN

问题描述

我正在计算我的数组的前 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" ]

我现在正在尝试使用.reduce在我的尝试中计算数组中这 4 个数字的总和,但我得到了 NaN 的返回,这是我的代码:

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

我也没有说这些被转换的数字是一串数字,所以试图将它们转换成整数,let sumArr = topArr.map(Number);也返回 NaN。我期望数组中 4 个数字的总和结果等于651,229

标签: javascriptarrayssum

解决方案


逗号不在 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);

如您所见,它们都产生相同(正确)的输出。


推荐阅读