将数组中的连续数字相加,并跳过假值JS

  • 本文关键字:JS 数组 连续 数字 javascript
  • 更新时间 :
  • 英文 :


我有一个包含这些值的数字数组

const arr = [NaN, NaN, 1, 2, 3, NaN, NaN, 4, 5, 6, 7, NaN, 8, 9, 10, NaN, 100, 200, 300, 400, 500];

如何将这些连续的值相加,同时跳过假值(NaN),并使用这个假值作为子和的分隔符?

预期结果:

const res = [6, 22, 27, 1500] 

到目前为止,我尝试实现reduce(),但可能在错误的方式,也常规的for循环没有得到预期的结果..

如果数字加起来可能为0,您将需要执行isNaN测试。

建议代码:

const arr = [NaN, 1, -1, NaN, 1, 2, 3, NaN, NaN, 4, 5, 6, 7, NaN, 8, 9, 10, NaN, 100, 200, 300, 400, 500];
//                ^^^^^^ added those in the example
const sums = arr.reduce((acc, val, i) => {
if (!Number.isNaN(val)) {
if (Number.isFinite(arr[i-1])) val += acc.pop();
acc.push(val);
}
return acc;
}, []);
console.log(sums);

您可以使用一个条件来跳过这些错误的值:

const arr = [NaN, NaN, 1, 2, 3, NaN, NaN, 4, 5, 6, 7, NaN, 8, 9, 10, NaN, 100, 200, 300, 400, 500];
const countValid = (arr) => {
let  total = 0;
let   result = []
for (let i = 0; i < arr.length; i++)
{
if (arr[i]) total+=arr[i]
else if (total !== 0) {
result.push(total);
total = 0;
}
}
if (total !== 0)
result.push(total)
return result;
}
console.log(countValid(arr)) // prints expected output [6, 22, 27, 1500] 

如果NaN和NaN之间的一系列数字加起来等于0(如果有负数)

const arr = [NaN, NaN, 1, 2, 3, NaN, NaN, 4, 5, 6, 7, NaN, 8, 9, 10, NaN, 100, 200,NaN,1,-1,NaN, 300, 400, 500];
const result = []
let sum=0;
arr.forEach((num,i)=>{
if(isNaN(num)) {
if(!isNaN(arr[i-1])){
result.push(sum)
sum=0;
return;
}
return;
}
sum+=num;
if(i===arr.length-1) result.push(sum)
})
console.log(result)

你可以试试下面的代码:

let arr = [NaN, NaN, 1, 2, 3, NaN, NaN, 4, 5, 6, 7, NaN, 8, 9, 10, NaN, 100, 200, 300, 400, 500];
let sum = 0;
for (let i = 0; i < arr.length; i++) {
if(arr[i]) sum += arr[i];
}
console.log(sum); // 1515

最新更新