我需要按关键字对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' }
当前回答
假设它在显示无序对象财产的VisualStudio调试器中很有用。
(function(s) {
var t = {};
Object.keys(s).sort().forEach(function(k) {
t[k] = s[k]
});
return t
})({
b: 2,
a: 1,
c: 3
});
与内联版本相同:
(function(s){var t={};Object.keys(s).sort().forEach(function(k){t[k]=s[k]});return t})({b:2,a:1,c:3})
其他回答
这是一个老问题,但从Mathias Bynens的回答中得到启示,我制作了一个简短的版本来对当前对象进行排序,而没有太多开销。
Object.keys(unordered).sort().forEach(function(key) {
var value = unordered[key];
delete unordered[key];
unordered[key] = value;
});
代码执行后,“无序”对象本身将按字母顺序对键进行排序。
也许更优雅的形式:
/***按键对键值对象排序,保持键到数据的相关性。*@param{Object}src键值对象*@return{Object}*/var ksort=函数(src){var keys=对象.keys(src),目标={};keys.sort();key.forEach(功能(键){target[key]=src[key];});回归目标;};//用途console.log(ksort({a: 1中,c: 3中,b: 2个}));
P.S.和ES6+语法相同:
function ksort( src ) {
const keys = Object.keys( src );
keys.sort();
return keys.reduce(( target, key ) => {
target[ key ] = src[ key ];
return target;
}, {});
};
只是为了简化它,让它更清晰,马特·鲍尔的答案
//您的对象变量myObj={b:'asdsadfd',c:“masdasaf”,a:'dsfdsfsdf'};//固定代码var键=[];for(myObj中的var k){如果(myObj.hasOwnProperty(k)){按键.按键(k);}}keys.sort();对于(var i=0;i<keys.length;i++){k=键[i];警报(k+':'+myObj[k]);}
很多人都提到“对象无法排序”,但在那之后,他们给了你一个可行的解决方案。矛盾,不是吗?
没有人提及这些解决方案为何奏效。它们是这样的,因为在大多数浏览器的实现中,对象中的值是按照添加它们的顺序存储的。这就是为什么如果您从排序的键列表中创建新对象,它将返回预期结果。
我认为我们可以再增加一个解决方案——ES5功能方式:
function sortObject(obj) {
return Object.keys(obj).sort().reduce(function (result, key) {
result[key] = obj[key];
return result;
}, {});
}
上述ES2015版本(格式为“一行”):
const sortObject = o => Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {})
上述示例的简短解释(如评论中所要求的):
Object.keys为我们提供了所提供对象(obj或o)中的键列表,然后我们使用默认排序算法对这些键进行排序,接下来使用reduce将数组转换回对象,但这次对所有键进行了排序。
使用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();
只是思考的食物。