【问题标题】:How can I sort an array in javascript by the frequency of values? [duplicate]如何按值的频率对javascript中的数组进行排序? [复制]
【发布时间】:2018-09-03 19:38:16
【问题描述】:

我正在寻找一个函数(最好使用 lodash 等),它将获取数组并产生预期的输出,如下所示:

const arr = [{name: 'Anna', score:4}, {name: 'Bob', score:5}, {name: 'Chris', score:4}]

// expected output
// [{name: 'Anna', score:4}, {name: 'Chris', score:4}, {name: 'Bob', score:5}]

即该函数应按以下方式排序:

1) 'score' 属性的频率

2) 'name' 属性(分数相等)

请注意,由于(1),此问题与标记为重复的问题不同。

【问题讨论】:

  • 如果你在这方面表现出自己的尝试,你可能会得到更多的牵引力。我认为根据链接的答案关闭它是不正确的,因为它们没有按频率排序。无论如何,我建议调查 lodash 中的 groupBy 运算符。您基本上想按分数分组,并按组的长度排序。
  • 我相信这不是重复的,因为这里我们希望按值频率排序,而不是按值排序
  • var _ = require('lodash'); const results = [{name: 'Anna', score:4}, {name: 'Bob', estimateValue:5},{name: 'Chris', estimateValue:4}]; const counts = _.countBy(results, x => x['score']); const r = results.map(x => ({...x, ...{'count': counts[x['score']]}})); _.orderBy(r, 'count') 工作...
  • countBy 的问题是你失去了名字的上下文(你说你最后也想订购)。如果您使用 groupBy,您将保留这些名称,并最终将它们映射到正确的顺序。如果您不需要按名称排序,countBy 通常会更好,因为它在处理较大的列表时需要的内存要少得多(您只需保留累积计数而不是所有值的数组)
  • 谢谢,在 lodash 中似乎可以将数组传递给 _.orderBy。所以_.orderBy(r, ['count', 'name'] 应该可以工作。

标签: javascript ecmascript-6 lodash


【解决方案1】:

您可以使用sort 函数对特定键进行排序。

const arr = [{name: 'Anna', score:4}, {name: 'Bob', score:5}, {name: 'Chris', score:4}]

arr.sort((a,b) => {
   return a.score === b.score ? a.name > b.name :  a.score > b.score;
});

console.log(arr);

【讨论】:

  • 谢谢。但是,我希望按每个分数出现的频率而不是分数本身的值进行排序。
猜你喜欢
  • 2021-07-28
  • 2021-12-03
  • 2019-01-15
  • 2011-04-04
  • 2021-11-22
  • 1970-01-01
  • 2020-10-19
相关资源
最近更新 更多