我需要的是类似于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,代码也应该工作。
我该怎么做?
答案 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)
我使用了reduce
和map
的组合,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
解决。我要添加C
和D
进行更多测试。
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);