Javascript搜索任务



>任务:你有带有键:值对的数组,例如:

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);

最新更新