Javascript 如何计算数组中的每个元素并为每个项创建键/值对象?
假设我有一个数组,如下所示:Javascript 如何计算数组中的每个元素并为每个项创建键/值对象?,javascript,arrays,Javascript,Arrays,假设我有一个数组,如下所示: 让myArray=[“丹尼斯”、“迈克”、“埃米莉”、“丹尼斯”、“约翰”、“乔纳森”、“温斯顿”、“梅丽莎”、“洛琳”、“托尼”、“芙里奥”、“约翰”、“迈克”、“约翰”] 我想计算此数组中的每个项目,并将它们放入如下数组: 让countedItems= [ {值:“丹尼斯”,计数:2}, {值:“迈克”,计数:2}, {值:“Emily”,计数:1}, {值:“丹尼斯”,计数:1}, {值:“约翰”,计数:3}, ... ] 有什么想法吗? 让myArray=
让myArray=[“丹尼斯”、“迈克”、“埃米莉”、“丹尼斯”、“约翰”、“乔纳森”、“温斯顿”、“梅丽莎”、“洛琳”、“托尼”、“芙里奥”、“约翰”、“迈克”、“约翰”]
我想计算此数组中的每个项目,并将它们放入如下数组:
让countedItems=
[
{值:“丹尼斯”,计数:2},
{值:“迈克”,计数:2},
{值:“Emily”,计数:1},
{值:“丹尼斯”,计数:1},
{值:“约翰”,计数:3},
...
]
有什么想法吗?
让myArray=[“丹尼斯”、“迈克”、“埃米莉”、“丹尼斯”、“约翰”、“乔纳森”、“温斯顿”、“梅丽莎”、“洛琳”、“托尼”、“芙里奥”、“约翰”、“迈克”、“约翰”]
让countedItems=myArray.reduce((acc,cur)=>{
acc[cur]?acc[cur]。计数++:acc[cur]={
值:cur,
计数:1
};
返回acc;
}, {});
常量输出=对象值(countedItems);
控制台日志(输出)代码>
让myArray=[“丹尼斯”、“迈克”、“埃米莉”、“丹尼斯”、“约翰”、“乔纳森”、“温斯顿”、“梅丽莎”、“洛琳”、“托尼”、“芙里奥”、“约翰”、“迈克”、“约翰”]
让countedItems=myArray.reduce((acc,cur)=>{
acc[cur]?acc[cur]。计数++:acc[cur]={
值:cur,
计数:1
};
返回acc;
}, {});
常量输出=对象值(countedItems);
控制台日志(输出)代码>您可以使用以下功能:
const arr = ["Dennis", "Mike", "Emily", "Dennis", "John", "Jonathan", "Winston", "Melissa", "Loraine", "Tony", "Furio", "John", "Mike", "John"]
const result = arr.reduce((p,c)=> {
const obj = p.filter(x=> x.value == c)[0];
if(obj){
obj.count +=1;
} else {
p.push({value:c,count:1})
}
return p;
},[])
更新:
const result = Object.entries(
arr.reduce((p,c)=>{
p[c]=p[c]?p[c]+1:1;
return p},{})
).map(x=>({value:x[0],count:x[1]}))
您可以使用以下功能:
const arr = ["Dennis", "Mike", "Emily", "Dennis", "John", "Jonathan", "Winston", "Melissa", "Loraine", "Tony", "Furio", "John", "Mike", "John"]
const result = arr.reduce((p,c)=> {
const obj = p.filter(x=> x.value == c)[0];
if(obj){
obj.count +=1;
} else {
p.push({value:c,count:1})
}
return p;
},[])
更新:
const result = Object.entries(
arr.reduce((p,c)=>{
p[c]=p[c]?p[c]+1:1;
return p},{})
).map(x=>({value:x[0],count:x[1]}))
你可以用电脑来做
const myArray=[
“丹尼斯”,
“迈克”,
“艾米丽”,
“丹尼斯”,
“约翰”,
“乔纳森”,
“温斯顿”,
“梅丽莎”,
“罗兰”,
“托尼”,
“Furio”,
“约翰”,
“迈克”,
“约翰”,
];
常量映射=新映射();
myArray.forEach((x)=>{
如果(映射has(x)){
const obj=map.get(x);
对象计数+=1;
映射集(x,obj);
}set(x,{value:x,count:1});
});
常量ret=Array.from(map,([,y])=>y);
控制台日志(ret)代码>您可以使用
const myArray=[
“丹尼斯”,
“迈克”,
“艾米丽”,
“丹尼斯”,
“约翰”,
“乔纳森”,
“温斯顿”,
“梅丽莎”,
“罗兰”,
“托尼”,
“Furio”,
“约翰”,
“迈克”,
“约翰”,
];
常量映射=新映射();
myArray.forEach((x)=>{
如果(映射has(x)){
const obj=map.get(x);
对象计数+=1;
映射集(x,obj);
}set(x,{value:x,count:1});
});
常量ret=Array.from(map,([,y])=>y);
控制台日志(ret)你尝试了什么?你尝试了什么?太棒了,太棒了!我刚刚又更新了答案。令人印象深刻。可读性强,切中要害。我想我应该做更多的“减少()”练习。太棒了,太棒了!我刚刚又更新了答案。令人印象深刻。可读性强,切中要害。我想我应该多做些“reduce()”练习。这也很有效!就性能而言,Array.filter被称为Array length times。filter()方法实际上迭代数组,因此,这个答案的性能是O(n*n)@William Wang,非常有洞察力!性能很重要。亲爱的William Wang,感谢您提到的一个非常好的观点,但是这种语法更易于阅读,而且工作起来也非常出色!就性能而言,Array.filter被称为Array length times。filter()方法实际上迭代数组,因此,这个答案的性能是O(n*n)@William Wang,非常有洞察力!性能很重要。亲爱的William Wang,感谢您提到的一个非常好的观点,但是这种语法更易于阅读,也非常有效。我怎么会错过.map()@无例外,它不是一个映射方法。映射对象是键控数据项的集合。检查上面描述中的链接。是的,我的错。我想我有很多东西要学。我查了一下描述。它准确地描述了我的要求,真是太棒了,效果也很好。我怎么会错过.map()@无例外,它不是一个映射方法。映射对象是键控数据项的集合。检查上面描述中的链接。是的,我的错。我想我有很多东西要学。我查了一下描述。它准确地描述了我的要求。