我需要按关键字对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解压缩map并sortBy对的第一个值,然后再次zip,它将返回排序的键。
如果要按值排序,请将对索引更改为1而不是0
var o = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' };
console.log(_(o).toPairs().sortBy(0).fromPairs().value())
其他回答
解决方案:
function getSortedObject(object) {
var sortedObject = {};
var keys = Object.keys(object);
keys.sort();
for (var i = 0, size = keys.length; i < size; i++) {
key = keys[i];
value = object[key];
sortedObject[key] = value;
}
return sortedObject;
}
// Test run
getSortedObject({d: 4, a: 1, b: 2, c: 3});
说明:
许多JavaScript运行时将值按添加顺序存储在对象内。
要按键对对象的财产进行排序,可以使用object.keys函数,该函数将返回键数组。然后可以通过array.prototype.sort()方法对键数组进行排序,该方法对数组中的元素进行排序(无需将它们分配给新变量)。
键排序后,您可以开始逐个使用它们来访问旧对象的内容,以填充新对象(现在已排序)。
以下是该过程的示例(您可以在目标浏览器中进行测试):
/***返回对象的副本,该副本按原始对象的键排序。**@param{Object}Object-原始对象。*@返回{Object}按关键字排序的原始对象的副本。*/函数getSortedObject(对象){//将返回带有排序键的新对象var sortedObject={};//从旧/当前对象获取密钥数组var keys=对象.keys(对象);//排序键(在位)keys.sort();//使用排序键将值从旧对象复制到新对象for(var i=0,size=keys.length;i<size;i++){key=键[i];value=对象[key];sortedObject[key]=值;}//返回新对象return sortedObject;}/***试运行*/var unsortedObject={d: 4中,a: 1中,b: 2,c: 3个};var sortedObject=getSortedObject(未排序对象);for(sortedObject中的var键){var text=“Key:”+Key+“,Value:”+sortedObject[Key];var段落=document.createElement('p');paragraph.textContent=text;document.body.appendChild(段落);}
注意:Object.keys是一个ECMAScript 5.1方法,但这里有一个用于旧浏览器的polyfill:
if (!Object.keys) {
Object.keys = function (object) {
var key = [];
var property = undefined;
for (property in object) {
if (Object.prototype.hasOwnProperty.call(object, property)) {
key.push(property);
}
}
return key;
};
}
JavaScript对象1未排序。试图对它们进行“排序”是没有意义的。如果要迭代对象的财产,可以对键进行排序,然后检索关联的值:
变量myObj={“b”:“asdsadfd”,“c”:“masdasaf”,“a”:“dsfdsfsdf”},键=[],k、 i,len;for(myObj中的k){如果(myObj.hasOwnProperty(k)){按键.按键(k);}}keys.sort();len=按键长度;对于(i=0;i<len;i++){k=键[i];console.log(k+':'+myObj[k]);}
使用Object.keys幻想的替代实现:
变量myObj={“b”:“asdsadfd”,“c”:“masdasaf”,“a”:“dsfdsfsdf”},keys=对象键(myObj),i、 len=按键长度;keys.sort();对于(i=0;i<len;i++){k=键[i];console.log(k+':'+myObj[k]);}
1不要迂腐,但没有JSON对象。
事实上,我非常惊讶的是,给出了30多个答案,但没有一个给出了这个问题的完整深度解决方案。有些解决方案很浅,而另一些解决方案很深,但有缺陷(如果未定义,则会崩溃,函数或符号将在json中)。
以下是完整的解决方案:
function sortObject(unordered, sortArrays = false) {
if (!unordered || typeof unordered !== 'object') {
return unordered;
}
if (Array.isArray(unordered)) {
const newArr = unordered.map((item) => sortObject(item, sortArrays));
if (sortArrays) {
newArr.sort();
}
return newArr;
}
const ordered = {};
Object.keys(unordered)
.sort()
.forEach((key) => {
ordered[key] = sortObject(unordered[key], sortArrays);
});
return ordered;
}
const json = {
b: 5,
a: [2, 1],
d: {
b: undefined,
a: null,
c: false,
d: true,
g: '1',
f: [],
h: {},
i: 1n,
j: () => {},
k: Symbol('a')
},
c: [
{
b: 1,
a: 1
}
]
};
console.log(sortObject(json, true));
这对我有用
/**
* 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;
};
这个问题的其他答案是过时的,从未与实现现实相匹配,并且在ES6/ES2015规范发布后正式变得不正确。
请参阅Axel Rauschmayer在《探索ES6》中关于属性迭代顺序的章节:
所有迭代属性键的方法都以相同的顺序执行:首先是数组索引,按数字排序。然后按创建顺序列出所有字符串键(不是索引)。然后是所有符号,按照它们的创建顺序。
是的,JavaScript对象实际上是有序的,它们的键/财产的顺序可以更改。
以下是如何按关键字/财产按字母顺序对对象进行排序:
常量无序={'b':'foo',“c”:“bar”,“a”:“baz”};console.log(JSON.stringify(无序));// → '{“b”:“foo”,“c”:“bar”,“a”:“baz”}'const ordered=Object.keys(无序).sort().reduce((obj,key)=>{obj[key]=无序[key];返回obj;}, {});console.log(JSON.stringify(有序));// → '{“a”:“baz”,“b”:“foo”,“c”:“bar”}'
为了与ES5引擎兼容,请使用var而不是const。