我需要按关键字对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' }
当前回答
如前所述,对象是无序的。
然而
你可能会发现这个成语很有用:
var o = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' };
var kv = [];
for (var k in o) {
kv.push([k, o[k]]);
}
kv.sort()
然后,您可以遍历kv并执行任意操作。
> kv.sort()
[ [ '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();
只是思考的食物。
核心版本:
function order(unordered)
{
return _.object(_.sortBy(_.pairs(unordered),function(o){return o[0]}));
}
如果你不信任你的浏览器来保持键的顺序,我强烈建议你依赖一个键值配对数组的有序数组。
_.sortBy(_.pairs(c),function(o){return o[0]})
只需使用lodash解压缩map并sortBy对的第一个值,然后再次zip,它将返回排序的键。
如果要按值排序,请将对索引更改为1而不是0
var o = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' };
console.log(_(o).toPairs().sortBy(0).fromPairs().value())
这里是一个基于lodash的干净版本,可以处理嵌套对象
/**
* Sort of the keys of an object alphabetically
*/
const sortKeys = function(obj) {
if(_.isArray(obj)) {
return obj.map(sortKeys);
}
if(_.isObject(obj)) {
return _.fromPairs(_.keys(obj).sort().map(key => [key, sortKeys(obj[key])]));
}
return obj;
};
如果lodash有一个toObject()方法,它会更干净。。。
最好的方法是
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删除长度属性。