拿出一系列虚构的商品,我们奇怪地只对商品名称和价值感兴趣:
let items = [
{ title: "Trumping the Horns", value: 5.95 },
{ title: "Rocking about", value: 20.00 },
{ title: "Trumping the Horns", value: 5.95 }
]
我知道我可以很容易地得到一个具有唯一值的数组:
const uniqueSales = [...new Set(items.map(item => item.title))];
但是比如说我想知道我卖的每件商品有多少,或者它们的累计价值?所以:
[
{ title: "Trumping the Horns", amount: 2 },
{ title: "Rocking about", amount: 1 }
]
是否可以映射这些,而不必对该数组进行一些疯狂的排序和迭代?优选在一个班轮。不做服务器端的主要原因是我对相同数据进行了大量不同的操作,并且发送一次并让客户端处理数据的操作和表示似乎是最正确的。
答案 0 :(得分:6)
您可以使用Map
并将引用存储到结果数组的新插入对象中。
@org.junit.Rule
public final ProvideSystemProperty property1 = new ProvideSystemProperty("MoreEuro", "You need more: 0.5 euro");
@org.junit.Test
public void testCountMoneyForCupSize() {
System.out.println("---------------- Count Money For Cup Size -----------------");
double largePrice = 1.5;
double mediumPrice = 1;
double smallPrice = 0.75;
try {
when(machineSpy.insertCash()).thenReturn(1.0);
assertEquals(machineSpy.countMoneyForCupSize(largePrice), System.getProperty("MoreEuro"));
} catch (InvalidCoinException e) {
System.out.println(e.getMessage());
}
}
答案 1 :(得分:2)
let items = [{
title: "Trumping the Horns",
value: 5.95
},
{
title: "Rocking about",
value: 20.00
},
{
title: "Trumping the Horns",
value: 5.95
}
];
console.log(items.reduce(function(countMap, item) {
countMap[item.title] = ++countMap[item.title] || 1;
return countMap;
}, {}));

答案 2 :(得分:1)
鉴于您最终想要的格式,我认为它比使用Map
构建具有title
和amount
的对象要短得多,然后抓住Map
的值:
const items = [
{ title: "Trumping the Horns", value: 5.95 },
{ title: "Rocking about", value: 20.00 },
{ title: "Trumping the Horns", value: 5.95 }
];
const map = new Map();
items.forEach(item => {
const entry = map.get(item.title);
if (!entry) {
map.set(item.title, {title: item.title, amount: 1});
} else {
++entry.amount;
}
});
const uniqueSales = [...map.values()];
console.log(uniqueSales);

...最好是单行......
上述内容可以用较少的线条,但它不会提高速度,可读性或可维护性。恰恰相反。
答案 3 :(得分:0)
我会使用地图而不是数组来存储您的商品,其中地图的键应该是商品的标题,而值应该是已售商品的数量。每次,在向地图添加新项目之前,您应该检查该密钥是否已经存在,如果存在,则增加数量,否则将新的键值对添加到地图中。
答案 4 :(得分:0)
let array = [{title:"123"}, {title: "234"}, {title: "123"}]
let sum = array.reduce((results, item, index) => {
let totalItem = results.find((element) =>
element.title == item.title)
if(totalItem){
totalItem.count += 1
}else {
results.push(Object.assign(item, {
count: 1
}))
}
return results
}, [])
使用array reduce生成新数组
答案 5 :(得分:0)
在ES6中,我们可以从下面的一行代码中获得返回的唯一项,
Set<Integer> counts = new HashSet<>();
counts.addAll(hash.values());
return counts.size() == hash.keySet().size();