JavaScript中的SUMIF()?

时间:2018-08-13 10:38:29

标签: javascript arrays math sum

我需要的是类似于Excel的SUMIF()函数。假设我有两个数组:

a = [A, B, B, A, B, A]; 
b = [4, 2, 7, 6, 8, 9];

现在,如果我们在a和b中采用相同的索引,则会得到: A:4,B:2,B:7,A:6,B:8,A:9。

我现在要对所有属于A的数字和属于B的数字求和,因此结果应为:A = 19和B = 17。

理想情况下,我应该构造一个像这样的字符串:“ A:19:B:17”。

例如,如果我有另一个要总结的C或D,代码也应该工作。

我该怎么做?

8 个答案:

答案 0 :(得分:3)

您可以使用Map

let a = ['A', 'B', 'B', 'A', 'B', 'A'];
let b = [4, 2, 7, 6, 8, 9];

let m = ((map) => {
  a.forEach((v, i) => {
    map.set(v, ((map.get(v) || 0) + b[i]));
  });
  
  return map;
})(new Map());

console.log([...m.entries()]);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

我使用了reducemap的组合,reduce计算每个元素的总和,并且map正在格式化字符串。

const a = ["A", "B", "B", "A", "B", "A"]; 
const b = [4, 2, 7, 6, 8, 9];

const sumObject = b.reduce((acc,e,i,arr) => {
  acc[a[i]] = (acc[a[i]] || 0) + e;
  return acc;
}, {});

const sum = Object.entries(sumObject).map(el => el[0]+":"+el[1]).join(":");

console.log(sum);

答案 2 :(得分:1)

const
    a = ["A", "B", "B", "A", "B", "A"],
    b = [4, 2, 7, 6, 8, 9],
    SUMIF = (vars, values) => {
        const varValues = {};
        let output = "";
        values.forEach((val, index) => {
            varValues[vars[index]] = varValues[vars[index]] ? varValues[vars[index]] + val : val;
        });
        Object.keys(varValues).forEach(key => output += `${key}:${varValues[key]}:`);
        return output.replace(/.$/, "");
    };

SUMIF(a, b);

答案 3 :(得分:0)

使用array.reduce:

var a = ['A', 'B', 'B', 'A', 'B', 'A']; 
var b = [4, 2, 7, 6, 8, 9];

var res = Object.entries(a.reduce((m, o, i) => (m[o] = m.hasOwnProperty(o) ? m[o] + b[i]: b[i], m), {})).map(([key, value]) => `${key}:${value}`).join(':');

console.log(res);

答案 4 :(得分:0)

a = ['A', 'B', 'B', 'A', 'B', 'A'];
b = [4, 2, 7, 6, 8, 9];

// 1. Create an object of sums
const sumMap = a.reduce((init, curr, index) => Object.assign(init, { [curr]: 
(init[curr] || 0) + b[index] }), {});
// 2. Transform to a string
const res = Object.entries(sumMap).map(([key, sum]) => `${key}:${sum}`).join(':');


console.log(res);

答案 5 :(得分:0)

您可以使用Map进行计数,并加入想要的格式的结果。

var a = ['A', 'B', 'B', 'A', 'B', 'A'], 
    b = [4, 2, 7, 6, 8, 9],
    result = Array
        .from(
            a.reduce((m, k, i) => m.set(k, (m.get(k) || 0) + b[i]), new Map),
            a => a.join(':')
        )
        .join(':');
    
console.log(result);

答案 6 :(得分:0)

可以使用reduce解决。我要添加CD进行更多测试。

const a = ['A', 'B', 'B', 'A', 'B', 'A', 'C', 'C', 'D']; 
const b = [4, 2, 7, 6, 8, 9, 10, 11, 20];

const sum = a.reduce((acc, item, index) => {   
  if (!acc[item]) { 
    acc[item] = 0 
  };
  acc[item] += b[index] || 0;
  
  return acc;
}, {});

const concat = Object.entries(sum).map(entry => entry.join(':')).join(':');

console.log(concat);

答案 7 :(得分:0)

您可以使用Array.prototype.reduce按字符对数据进行分组,并使用Array.prototype.map构造所需的输出:

var a = ['A', 'B', 'B', 'A', 'B', 'A']; 
var b = [4, 2, 7, 6, 8, 9];

var dataObj = a.reduce((t, c, i) => (t[c] = (t[c] || 0) + b[i], t), {});

var result = Object.keys(dataObj).map(c => `${c}:${dataObj[c]}`).join(':');

console.log(result);