sumif实现js
sumif 函数的 JavaScript 实现
在 JavaScript 中实现类似 Excel 的 SUMIF 功能,可以通过自定义函数来完成。SUMIF 的基本逻辑是对满足特定条件的数值进行求和。
基本实现
以下是一个简单的 sumif 函数实现,接受数组、条件和可选的求和范围:
function sumif(range, criteria, sumRange) {
let sum = 0;
const useSumRange = sumRange && sumRange.length === range.length;
for (let i = 0; i < range.length; i++) {
if (checkCriteria(range[i], criteria)) {
sum += useSumRange ? sumRange[i] : range[i];
}
}
return sum;
}
function checkCriteria(value, criteria) {
if (typeof criteria === 'function') {
return criteria(value);
}
if (typeof criteria === 'string') {
if (criteria.startsWith('>')) {
return value > parseFloat(criteria.substring(1));
}
if (criteria.startsWith('<')) {
return value < parseFloat(criteria.substring(1));
}
if (criteria.startsWith('=')) {
return value == criteria.substring(1);
}
return value == criteria;
}
return value === criteria;
}
使用示例
const data = [10, 20, 30, 40, 50];
const sum1 = sumif(data, '>30'); // 90 (40 + 50)
const sum2 = sumif(data, (x) => x % 20 === 0); // 60 (20 + 40)
const items = ['Apple', 'Banana', 'Apple', 'Orange'];
const quantities = [5, 10, 8, 3];
const sum3 = sumif(items, 'Apple', quantities); // 13 (5 + 8)
高级功能实现
对于更复杂的条件判断,可以扩展 checkCriteria 函数:
function checkCriteria(value, criteria) {
if (criteria instanceof RegExp) {
return criteria.test(value);
}
// 其他条件判断...
}
性能优化
对于大型数据集,可以考虑使用数组的 reduce 方法:

function sumif(range, criteria, sumRange) {
const useSumRange = sumRange && sumRange.length === range.length;
return range.reduce((sum, val, i) => {
return checkCriteria(val, criteria)
? sum + (useSumRange ? sumRange[i] : val)
: sum;
}, 0);
}
这个实现提供了基本的 SUMIF 功能,并支持多种条件格式,包括字符串比较、数值比较和自定义函数判断。可以根据需要进一步扩展条件判断逻辑。






