我正在创建一个网上购物车,在我的购物车中有一系列的产品。
let cars = ["Saab", "Volvo", "BMW", "Volvo"];
for (var i = 0; i < cars.length; i++) {
document.body.innerHTML += '<div >' + cars[i] + '</div>';
}
我得到了以下信息:
萨博
沃尔沃
宝马
沃尔沃
我需要的是:
萨博
沃尔沃x2
宝马
做这件事最好的方法是什么?
发布于 2018-12-20 06:03:43
您可以使用Map
进行计数,并迭代此映射以获得渲染结果。
let cars = ["Saab", "Volvo", "BMW", "Volvo"],
count = cars.reduce((m, v) => m.set(v, (m.get(v) || 0) + 1), new Map);
count.forEach((v, k) => document.body.innerHTML += '<div>' + k + (v > 1 ? ' x' + v : '') + '</div>');
发布于 2018-12-20 06:03:08
这是一个相当基本的编程问题。我不会给你答案,但我可以给你解决方案的一般结构。
您的输入是一个包含多个无序项目的数组,您需要做的第一件事是创建一个新结构,该结构对具有相同名称的项目进行分组。
为此,我将创建一个单独的对象,其中包含项以及它们出现的频率。您应该使用Map。
循环通过cars数组,并为每辆汽车向Map添加一个条目。您可以使用汽车类型作为关键字,值应该是您看到汽车的频率。
所以对于你的每一个循环:
最后,您得到了一个键->值映射,其中包含项及其计数。
现在你可以循环你的地图和简单地输出汽车类型一个接一个,并附加2x
,如果有超过1。
发布于 2018-12-20 06:08:42
将初始数组转换为映射。映射中每个元素的键是汽车的名称,值是汽车在初始列表中出现的次数。
迭代汽车地图并生成HTML字符串。
为整个文档设置HTML有点奇怪,但下面的代码片段应该会得到您想要的内容。
// initial car array
let carArr = ["Saab", "Volvo", "BMW", "Volvo"];
console.log(carArr);
// convert to a map with counts
let carObj = {};
for (let car of carArr) {
carObj[car] = 1 + (carObj[car] || 0);
}
console.log(carObj);
// concatenate the HTML string
var s = "";
for (let car in carObj) {
s += '<div >' + car + (carObj[car] > 1 ? ' x' + carObj[car] : '') + '</div>';
}
// set the body HTML
document.body.innerHTML += s;
https://stackoverflow.com/questions/53859713
复制相似问题