我有JSON数组。我想根据用户的条目数给出排名。在这里srjahir32@gmail.com将获得第一名,因为它有3个条目。其他人将根据参赛人数分别获得第二名和第三名。
doSomeQ()
您会看到我的代码用户计算条目的数量。它给了我总条目,但我不知道如何计算排名。
上面的代码让我按值分组。但它并没有帮助我计算排名。 输出应该只是用户的排名。像1,2或3。
答案 0 :(得分:3)
您可以使用Array#reduce
。
您只需将accumulator
设置为key
,并将所有电子邮件的出现次数设置为value
。
let arr = [
{"email": "srjahir32@gmail.com"},
{"email": "srjahir32@gmail.com"},
{"email": "srjahir32@gmail.com"},
{"email": "g.anshul@gmail.com"},
{"email": "bspilak@cooperequipment.ca"},
{"email": "g.anshul@gmail.com"}
];
let ranking = arr.reduce((acc, curr) => {
if(acc[curr.email]) acc[curr.email]++;
else acc[curr.email] = 1;
return acc;
},{});
console.log(ranking);
答案 1 :(得分:2)
您可以计算出现次数并按计数对结果进行排序。
function groupBy(list, key) {
const map = new Map();
list.forEach(item => map.set(item[key], (map.get(item[key]) || 0) + 1));
return [...map]
.sort(({ 1: a }, { 1: b }) => a - b)
.map((rank => (item, i, a) => ({ [key]: item[0], rank: (a[i - 1] || [])[1] === item[1] ? rank : ++rank }))(0));
}
var data = [{ email: "3@gmail.com" }, { email: "3@gmail.com" }, { email: "3@gmail.com" }, { email: "2@gmail.com" }, { email: "2@cooperequipment.ca" }, { email: "2@cooperequipment.ca" }, { email: "2@gmail.com" }],
grouped = groupBy(data,'email');
console.log(grouped);

答案 2 :(得分:1)
使用功能reduce
和sort
var array = [ {"email": "srjahir32@gmail.com"}, {"email": "srjahir32@gmail.com"}, {"email": "srjahir32@gmail.com"}, {"email": "g.anshul@gmail.com"}, {"email": "bspilak@cooperequipment.ca"}, {"email": "g.anshul@gmail.com"}];
var result = Object.values(array.reduce((a, c) => {
(a[c.email] || (a[c.email] = {email: c.email, rank: 0})).rank++;
return a;
}, {})).sort((a, b) => b.rank - a.rank);
result.forEach((r, i) => r.rank = i + 1);
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }