>任务:你有带有键:值对的数组,例如:
arr = ["x:1", "y:2", "a:5", "x:5", "z:0"]
您必须对所有相同的键求和,以便:
["x:6","y:2","a:5","z:0"]
在输出时。
我完成了这项任务,但它很复杂。我已经解决了任务,但我正在寻找更简单的解决方案
var a = ["x:1", "y:2", "a:5", "x:5", "z:0"]
function saberi(niz) {
let povratni = [];
for (clan of niz) {
let razdvojen = clan.split(":");
let key = razdvojen[0]
let value = razdvojen[1]
let provjera = false
for (let i = 0; i < povratni.length; i++) {
let razdvojen2 = povratni[i].split(":")
let key2 = razdvojen2[0]
let value2 = razdvojen2[1]
if (key2 == key) {
console.log("uso")
let novavrijednost = parseFloat(value) + parseFloat(value2)
povratni[i] = key2 + ":" + novavrijednost
provjera = true
break
}
}
if (!provjera) {
povratni.push(clan)
}
}
console.log(povratni)
return povratni
}
saberi(a)
您可以使用对象来简化此操作。冒号:
左侧的每个字符将成为对象中的一个键,冒号右侧的数字将是值,您可以将其累积到给定键处的对象的值。
首先,arr
您可以使用 for...的循环,对于数组中的每个字符串,使用.split(":")
将字符串分解为其键和值组件。然后,您可以使用grouped[key]
从对象 (grouped
) 中获取存储在键处的当前值。如果该值不存在,则可以使用|| 0
将其默认为 0。将当前值存储在对象中后,可以将值的数字版本添加到累积值中,并将该新值存储在对象中的键key
。
一旦你有了你的对象,你可以抓取条目来获取一个形式[[key, value], [key2, value2], ...]
数组,你可以使用它.map()
将每个[key, value]
转换为形式key:value
的字符串:
const arr = ["x:1", "y:2", "a:5", "x:5", "z:0"];
const grouped = {};
for(const str of arr) {
const [key, num] = str.split(":");
grouped[key] = (grouped[key] || 0) + Number(num);
}
const res = Object.entries(grouped).map(entry => entry.join(":"));
console.log(res);
上述相同的概念可以使用带有 Map 而不是对象的.reduce()
来完成,以及将 Map 的条目映射到数组Array.from
:
const arr = ["x:1", "y:2", "a:5", "x:5", "z:0"];
const res = Array.from(arr.reduce((map, str) => {
const [key, val] = str.split(":");
return map.set(key, (map.get(key) || 0) + +val);
}, new Map), entry => entry.join(':'));
console.log(res);
您可以使用Array.prototype.reduce()
方法。遍历数组并按colon(:)
拆分每个项目。然后按键分组以计算总和。最后,使用Object.entries()
方法将对象转换为key-value
对数组,然后通过colon(:)
映射和连接它。
const arr = ['x:1', 'y:2', 'a:5', 'x:5', 'z:0'];
const ret = Object.entries(
arr.reduce((prev, c) => {
const p = prev;
const [k, v] = c.split(':');
p[k] = p[k] ?? 0;
p[k] += +v;
return p;
}, {})
).map((x) => x.join(':'));
console.log(ret);