我需要按关键字对JavaScript对象进行排序。
因此如下:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
将变成:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
我需要按关键字对JavaScript对象进行排序。
因此如下:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
将变成:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
当前回答
使用lodash可以:
some_map = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
// perform a function in order of ascending key
_(some_map).keys().sort().each(function (key) {
var value = some_map[key];
// do something
});
// or alternatively to build a sorted list
sorted_list = _(some_map).keys().sort().map(function (key) {
var value = some_map[key];
// return something that shall become an item in the sorted list
}).value();
只是思考的食物。
其他回答
我喜欢上面的这个,只是它不起作用:
/**
* Return an Object sorted by it's Key
*/
var sortObjectByKey = function(obj){
var keys = [];
var sorted_obj = {};
for(var key in obj){
if(obj.hasOwnProperty(key)){
keys.push(key);
}
}
// sort keys
keys.sort();
// create new array based on Sorted Keys
jQuery.each(keys, function(i, key){
sorted_obj[key] = obj[key];
});
return sorted_obj;
};
看起来像sorted_obj,没有秩序的保证,因为那张地图似乎更适合,我最终改变了地图的对象,类似这样:
/**
* Return an Object sorted by it's Key
*/
var sortObjectByKey = function(obj){
var keys = [];
let sorted_map = new Map();
for(var key in obj){
if(obj.hasOwnProperty(key)){
keys.push(key);
}
}
// sort keys
keys.sort();
// create new map based on Sorted Keys
keys.forEach(key => {
sorted_map.set(key, obj[key]);
});
return sorted_map;
};
最好的方法是
const object = Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {})
//else if its in reverse just do
const object = Object.keys(0).reverse ()
您可以首先将几乎类似数组的对象转换为实际数组,然后使用.reverse():
Object.assign([], {1:'banana', 2:'apple',
3:'orange'}).reverse();
// [ "orange", "apple", "banana", <1 empty slot> ]
结尾处的空槽if cause,因为第一个索引是1而不是0。可以使用.length--或.pop()删除空槽。
或者,如果您想借用.reverse并在同一个对象上调用它,它必须是一个完全类似数组的对象。也就是说,它需要长度属性:
Array.prototype.reverse.call({1:'banana', 2:'apple',
3:'orange', length:4});
// {0:"orange", 1:"apple", 3:"banana", length:4}
注意,它将返回同一个完全类似数组的对象对象,因此它不是一个真正的数组。然后可以使用delete删除长度属性。
在保留引用的同时递归排序键。
function sortKeys(o){
if(o && o.constructor === Array)
o.forEach(i=>sortKeys(i));
else if(o && o.constructor === Object)
Object.entries(o).sort((a,b)=>a[0]>b[0]?1:-1).forEach(e=>{
sortKeys(e[1]);
delete o[e[0]];
o[e[0]] = e[1];
});
}
例子:
let x = {d:3, c:{g:20, a:[3,2,{s:200, a:100}]}, a:1};
let y = x.c;
let z = x.c.a[2];
sortKeys(x);
console.log(x); // {a: 1, c: {a: [3, 2, {a: 1, s: 2}], g: 2}, d: 3}
console.log(y); // {a: [3, 2, {a: 100, s: 200}}, g: 20}
console.log(z); // {a: 100, s: 200}
不确定这是否能回答问题,但这正是我需要的。
Maps.iterate.sorted = function (o, callback) {
var keys = Object.keys(o), sorted = keys.sort(), k;
if ( callback ) {
var i = -1;
while( ++i < sorted.length ) {
callback(k = sorted[i], o[k] );
}
}
return sorted;
}
调用为:
Maps.iterate.sorted({c:1, b:2, a:100}, function(k, v) { ... } )
核心版本:
function order(unordered)
{
return _.object(_.sortBy(_.pairs(unordered),function(o){return o[0]}));
}
如果你不信任你的浏览器来保持键的顺序,我强烈建议你依赖一个键值配对数组的有序数组。
_.sortBy(_.pairs(c),function(o){return o[0]})