根据JSON数组值计算用户的等级

时间:2018-03-15 12:55:18

标签: javascript arrays json

我有JSON数组。我想根据用户的条目数给出排名。在这里srjahir32@gmail.com将获得第一名,因为它有3个条目。其他人将根据参赛人数分别获得第二名和第三名。

doSomeQ()

您会看到我的代码用户计算条目的数量。它给了我总条目,但我不知道如何计算排名。

上面的代码让我按值分组。但它并没有帮助我计算排名。 输出应该只是用户的排名。像1,2或3。

JSFiddle

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)

使用功能reducesort



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