给定一个Map如何按值排序,如果值匹配按关键Javascript排序?

时间:2019-04-05 08:04:28

标签: javascript

地图

{
  'i' => 2, 
  'love' => 2, 
  'leetcode' => 1, 
  'coding' => 1
}

我想

  • 根据值对Map进行排序
  • 如果值匹配,则按键排序,字母顺序较低的单词排在最前面。

预期

{
  "i" => 2, 
  "love" => 2, 
  "coding" => 1,
  'leetcode' => 1, 
}

我尝试过的解决方案

let map = new Map();
map.set("i", 2);
map.set("love", 2);
map.set("coding", 1);
map.set("live", 1);

let output = new Map([...map.entries()].sort((a, b) => {
  //if b[0] and a[0] matches sort by  key stuck here
  return b[0] - a[0];
  
}));

console.log(output);

2 个答案:

答案 0 :(得分:4)

您需要对计数进行降序排序,并以String#localeCompare升序对字符串进行排序。

第一部分采用两个值的差值,而Array#sort期望值

  • 小于a的零小于b,这意味着两者具有正确的顺序,例如1 - 2,得到-1

  • 等于零,表示bot元素具有相同的值,例如7 - 7

  • 大于零,这意味着两个元素都必须交换,例如5 - 3

相同的结果返回带有字符串的localeCompare

let map = new Map();
map.set("coding", 1);
map.set("love", 2);
map.set("live", 1);
map.set("i", 2);

let output = new Map([...map].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])));

console.log([...output]);

答案 1 :(得分:4)

值出现在索引// Crashing: implementation "androidx.appcompat:appcompat:1.1.0-alpha01" // Working: implementation "androidx.appcompat:appcompat:1.1.0-alpha03" 上,因此将索引更新为1以基于值进行排序,并使用String#localeCompare进行字符串比较。

1


或使用ES6 Destructuring assignment

let map = new Map();
map.set("i", 2);
map.set("love", 2);
map.set("coding", 1);
map.set("live", 1);

// for sorting based on number we need to return the difference
// in case those are equals difference would be 0(falsy value)
// and the or part will be executed and returns(string comaprison)
let output = new Map([...map].sort((a,b) => b[1] - a[1] || a[0].localeCompare(b[0]) ));

console.log(...output);

仅供参考: :了解Logical operators refer to MDN docs的基本概念。