【问题标题】:Reverse an ES6 Map反转 ES6 映射
【发布时间】:2016-06-01 14:27:16
【问题描述】:

假设我创建了一个像 Map {"a" => "apple", "b" => "banana"} 这样的 Map 对象:

m = new Map([ ["a", "apple"], ["b", "banana"] ]);

现在我想反转它并得到Map {"b" => "banana", "a" => "apple"}

我认为这样做的唯一方法如下:

new Map(Array.from(m.entries()).reverse());

这看起来既不简洁也不直截了当。有没有更好的方法?

【问题讨论】:

  • 您认为“更好”究竟是什么?也许只是将该代码放入函数中? function reverseMap(map) { ... }。没有人需要知道丑陋的真相......
  • 如果您非常关心地图的顺序,我建议您首先使用数组。 Maps 实际上的排序只是为了在引擎之间具有确定性和一致性,而不是您手动排序。
  • @Bergi 我使用 Map,因为我需要唯一的键:每个键的集合中只有一个可能的值。

标签: javascript arrays dictionary ecmascript-6 reverse


【解决方案1】:

您可以放弃 .entries() 调用,因为这是地图的默认迭代器:

new Map(Array.from(m).reverse())

这对我来说实际上既简洁又直接 - 将地图转换为序列,将其反转,再转换回地图。

【讨论】:

  • 我不知道地图保证订单。这是我们甚至应该依赖的东西吗?
  • @naomik:是的,地图(与对象相反)确实有一个确定的顺序,正是为了让诸如此类的事情可预测。
  • @Bergi 澄清一下:Object.getOwnPropertyNames() 在 ES6 中不会产生确定性顺序吗? (抱歉这么迂腐)
  • @Iven 事实上Object.getOwnPropertyNames() 确实有可预测的顺序,但for in 枚举没有。
  • @user633183 在 ES6 JavaScript 中,所谓的映射保证顺序,这就是它们的用途。但当然在例如JavaPython 他们通常不这样做(同样,很少使用的实现也可以维护这些语言的顺序)。
【解决方案2】:

new Map([...m].reverse());怎么样?

let m = new Map([['a', 'apple'], ['b', 'banana']]);
let r = new Map([...m].reverse());

console.log([...m]);
console.log([...r]);

【讨论】:

  • 哇,这三个点是什么意思?以前没见过
  • @MikhailBatcer Spread operator
猜你喜欢
  • 2010-10-03
  • 2011-11-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多