按值对映射/哈希进行排序,保留键
Sort Map/Hash by values, retaining keys
我花了很多时间寻找这个问题的答案。
我想在 JavaScript 中有一个哈希,如下所示:
const hash = {
a: 'A',
c: 'C',
b: 'B'
}
我想按值对对象进行排序,这样它可能会变成:
const hash = {
a: 'A',
b: 'B',
c: 'C',
}
现在,我意识到 POJSO 不能保证其密钥的顺序,因此我正在考虑使用immutableJS
或一些对象来保证哈希中密钥的顺序。
所以我正在寻找类似的东西:
var newHash = Immutable.Map(hash).sortBy(function(key,val){
return val;
});
但我不相信这存在。这要求是不是太过分了?如何找到此功能?
Lodash 单行:
sorted = _(hash).toPairs().sortBy(1).fromPairs().value();
现场示例:
var data = {a: 'A', c: 'C', b: 'B'};
var hash = _(data).toPairs().sortBy(1).fromPairs().value();
Object.getOwnPropertyNames(hash).forEach(n => {
snippet.log("hash['" + n + "'] = " + hash[n]);
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.min.js"></script>
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
现在,我意识到 POJSO 不保证其密钥的顺序
他们现在这样做了,从ES2015开始。您仍然无法通过for-in
或Object.keys
访问该订单,但您可以通过Object.getOwnPropertyNames
。订单由规范操作[[OwnPropertyKeys]]
给出。忽略继承的属性,它基本上是:键是符合整数索引条件的字符串,按数字顺序排列;后跟作为字符串的其余键,按属性的创建顺序排列;后跟Symbol
s(按创建顺序)的键。
有了这些信息,如果你的键都是不符合整数索引条件的字符串,那么在符合 ES2015 的引擎上,我们可以这样做:
-
以任何顺序从属性开始(例如,
a
、c
、b
) -
使用
Object.keys
将这些键作为数组获取 -
使用
Array#map
创建一个对象数组,其中包含键和值的属性(我在下面使用了k
和v
) -
按值对数组进行排序
-
使用
Array#reduce
创建新对象,并按排序顺序向其添加属性。(有些人,包括我自己,可能会争辩说这是对reduce
的轻微误用,因为累加器实际上从未改变过,但是嘿,它让我们都是l33t[这仍然是一回事吗?]并避免中间变量。嗯,因为这是一个目标?:-) )
最终结果是一个对象,其属性按创建顺序排列,这是其值的顺序,因为我们按该顺序创建了它们。我们可以通过以下方式访问该订单 Object.getOwnPropertyNames
.
// The unsorted data
let data = {
a: 'A',
c: 'C',
b: 'B'
};
// Create it sorted
const hash = Object.keys(data)
.map(key => ({k: key, v: data[key]}))
.sort((a, b) => a.v.localeCompare(b.v))
.reduce((o, e) => {
o[e.k] = e.v;
return o;
}, {});
// Display the sorted result
Object.getOwnPropertyNames(hash).forEach(n => {
console.log("hash['" + n + "'] = " + hash[n]);
});
<小时 />
撇开所有这些不谈,正如我在对这个问题的评论中所说,我不确定你为什么要这样做。似乎如果我们知道您的最终目标是什么,我们也许能够为您指出一个更有用的方向......
- 分派点击事件并保留击键修饰符
- 在可排序的JQuery UI列表中至少保留一个项目
- 按值对映射/哈希进行排序,保留键
- AngularJS - 在服务内部对数组进行排序,在控制器/视图中保留绑定
- 车把:在保留原始排序索引的同时对列表进行排序
- JQuery 表排序器 - 保留第一行不变
- 执行列排序后,dgrid 无法保留滚动位置
- 排序通过保留键名
- 对 json 保留索引进行排序
- 更新数据时保留和提示排序顺序
- JavaScript[].Sort()方法在应该保留元素时进行排序
- 在保留键的情况下,基于对象属性对映射进行排序
- 如何在排序后保留事件侦听器
- 在Javascript中保留对象数组排序后的插入顺序
- 用Angular JS的排序和过滤保留砖石效果
- 在javascript中基于另一个数组对数组进行排序,同时在末尾保留未排序的元素
- 对列表进行排序,但保留CSS标记
- 如何排序选择列表中的选项,但保留一个在顶部
- 自定义不区分大小写排序函数,保留原始的大小写
- 如何按值对关联数组排序并保留值