Javascript/ES6查找唯一的元素并在数组中对它们进行计数

Javascript/ES6查找唯一的元素并在数组中对它们进行计数,javascript,arrays,Javascript,Arrays,以一组虚构的已售出商品为例,奇怪的是,我们只对商品名称和价值感兴趣: 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

以一组虚构的已售出商品为例,奇怪的是,我们只对商品名称和价值感兴趣:

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 }
]

不必对数组进行疯狂的排序和迭代,也可以映射它们吗?最好是一行。不在服务器端执行此操作的主要原因是,我对同一数据进行了大量不同的操作,而且似乎最正确的做法是只发送一次,让客户端处理数据的操作和显示。

我会使用地图而不是数组来存储您的项目,其中,地图的键应为物品的标题,值应为已售出物品的数量。每次,在向映射添加新项之前,应检查键是否已存在,如果已存在,则增加数量,否则向映射添加新的键值对。

您可以使用并存储对结果数组新插入对象的引用

var items=[{title:“吹牛”,value:5.95},{title:“摇摆”,value:20.00},{title:“吹牛”,value:5.95}],
结果=项。减少(
(map=>(r,a)=>(!map.has(a.title)和&map.set(a.title,r[r.push({title:a.title,amount:0})-1]),map.get(a.title).amount++,r))(新映射),
[]
);
console.log(结果)
let项目=[{
标题:“吹响号角”,
数值:5.95
},
{
标题:“摇摆”,
价值:20.00
},
{
标题:“吹响号角”,
数值:5.95
}
];
console.log(items.reduce)(函数(countMap,item){
countMap[item.title]=++countMap[item.title]| 1;
返回计数图;

}, {}));
考虑到您最终想要的格式,我认为它不会比使用
地图
构建带有
标题
金额
的对象,然后获取
地图
的值短多少:

const项=[
{标题:“吹响号角”,价值:5.95},
{标题:“摇摆”,值:20.00},
{标题:“吹响号角”,价值:5.95}
];
常量映射=新映射();
items.forEach(item=>{
const entry=map.get(item.title);
如果(!输入){
map.set(item.title,{title:item.title,amount:1});
}否则{
++分录金额;
}
});
const uniqueSales=[…map.values()];
控制台日志(uniqueSales)

使用array reduce生成新数组

在ES6中,我们可以从一行代码中获得返回的唯一项,如下所示

// with arrays
const dupArr = [1, 1, 2, 3, 1];
const uniArr = [...(new Set(dupArr))];
// [1, 2, 3]

// with objects on a key.
const dupObj = [{ id: 1, value: 'a' }, { id: 2, value: 'b' }, { id: 1, value: 'c' }];
const uniKeys = [...(new Set(dupObj.map(({ id }) => id)))];
// [ '1', '2' ]

完全同意一行。可能是用词不当,我的主要目的是尽可能简洁,只使用最少且最合理的步骤。@Dennis:值得注意的是,Nina的解决方案不如上面的(不必要的键查找)有效,纯粹是为了让她能将其塞进表达式而不是语句中。现在,99.9999%的时间你不在乎,但这是一个如何减少陈述的例子!=最有效、步骤最少的解决方案。这不会产生OP想要的输出。漂亮-tyvm。
// with arrays
const dupArr = [1, 1, 2, 3, 1];
const uniArr = [...(new Set(dupArr))];
// [1, 2, 3]

// with objects on a key.
const dupObj = [{ id: 1, value: 'a' }, { id: 2, value: 'b' }, { id: 1, value: 'c' }];
const uniKeys = [...(new Set(dupObj.map(({ id }) => id)))];
// [ '1', '2' ]