我需要按键对JavaScript对象进行排序。
因此如下:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
会变成:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
答案 0 :(得分:341)
此问题的其他答案已过时,从未与实施现实相匹配,并且在ES6 / ES2015规范发布后正式变得不正确。
请参阅the section on property iteration order in Exploring ES6 by Axel Rauschmayer:
所有迭代属性键的方法都以相同的顺序执行:
- 首先是所有数组索引,按数字排序。
- 然后是所有字符串键(不是索引),按照它们的创建顺序。
- 然后是所有符号,按照创建的顺序。
醇>
是的,JavaScript对象实际上是,并且可以更改其键/属性的顺序。
以下是按字母顺序按键/属性对对象进行排序的方法:
$group_id = mysqli_real_escape_string($db, $_POST["group_id"]);
$query_user = mysqli_query($db,
"SELECT
User.user_id, User.username
FROM users User
INNER JOIN users_groups UserGroup
ON User.user_id = UserGroup.user_id
WHERE UserGroup.group_id = '$group_id'
");
while ($row_user = mysqli_fetch_object($query_user)) {
echo $row_user->username.'<br>';
}
&#13;
使用const unordered = {
'b': 'foo',
'c': 'bar',
'a': 'baz'
};
console.log(JSON.stringify(unordered));
// → '{"b":"foo","c":"bar","a":"baz"}'
const ordered = {};
Object.keys(unordered).sort().forEach(function(key) {
ordered[key] = unordered[key];
});
console.log(JSON.stringify(ordered));
// → '{"a":"baz","b":"foo","c":"bar"}'
代替var
与ES5引擎兼容。
答案 1 :(得分:230)
JavaScript对象 1 未订购。尝试“排序”它们毫无意义。如果要迭代对象的属性,可以对键进行排序,然后检索关联的值:
var myObj = {
'b': 'asdsadfd',
'c': 'masdasaf',
'a': 'dsfdsfsdf'
},
keys = [],
k, i, len;
for (k in myObj) {
if (myObj.hasOwnProperty(k)) {
keys.push(k);
}
}
keys.sort();
len = keys.length;
for (i = 0; i < len; i++) {
k = keys[i];
console.log(k + ':' + myObj[k]);
}
使用Object.keys
fanciness的替代实现:
var myObj = {
'b': 'asdsadfd',
'c': 'masdasaf',
'a': 'dsfdsfsdf'
},
keys = Object.keys(myObj),
i, len = keys.length;
keys.sort();
for (i = 0; i < len; i++) {
k = keys[i];
console.log(k + ':' + myObj[k]);
}
答案 2 :(得分:140)
很多人都提到“对象无法排序”,但之后他们会给你一个有效的解决方案。悖论,不是吗?
没人提到为什么这些解决方案有效。它们是,因为在大多数浏览器的实现中,对象中的值按照添加顺序存储。这就是为什么如果你从排序的键列表中创建新对象,它会返回预期的结果。
我认为我们可以再增加一个解决方案 - ES5功能方式:
function sortObject(obj) {
return Object.keys(obj).sort().reduce(function (result, key) {
result[key] = obj[key];
return result;
}, {});
}
上面的ES2015版本(格式化为“one-liner”):
function sortObject(o) {
return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
}
上述例子的简短解释(如评论中所述):
Object.keys
向我们提供了所提供对象(obj
或o
)中的键列表,然后我们使用默认排序算法对这些键进行排序,下一个.reduce
是用于将该数组转换回对象,但这次将所有键都排序。
答案 3 :(得分:27)
这对我有用
/**
* 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;
};
答案 4 :(得分:26)
伙计们,我很震惊!当然,所有答案都有些陈旧,但没人能提到排序的稳定性!因此,请允许我尽力回答问题本身,并在此处进行详细说明。所以我要道歉,现在要阅读很多东西。
自2018年以来,我将仅使用ES6,Polyfills在MDN文档中都可用,我将在给定的部分进行链接。
答案:
如果键只是数字,则可以安全地将Object.keys()
与Array.prototype.reduce()
一起使用以返回已排序的对象:
// Only numbers to show it will be sorted.
const testObj = {
'2000': 'Articel1',
'4000': 'Articel2',
'1000': 'Articel3',
'3000': 'Articel4',
};
// I'll explain what reduces does after the answer.
console.log(Object.keys(testObj).reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* '1000': 'Articel3',
* '2000': 'Articel1',
* '3000': 'Articel4',
* '4000': 'Articel2'
* }
*/
// if needed here is the one liner:
console.log(Object.keys(testObj).reduce((a, c) => (a[c] = testObj[c], a), {}));
但是,如果您使用的是字符串,我强烈建议将Array.prototype.sort()
链接到所有这些字符串中:
// String example
const testObj = {
'a1d78eg8fdg387fg38': 'Articel1',
'z12989dh89h31d9h39': 'Articel2',
'f1203391dhj32189h2': 'Articel3',
'b10939hd83f9032003': 'Articel4',
};
// Chained sort into all of this.
console.log(Object.keys(testObj).sort().reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* a1d78eg8fdg387fg38: 'Articel1',
* b10939hd83f9032003: 'Articel4',
* f1203391dhj32189h2: 'Articel3',
* z12989dh89h31d9h39: 'Articel2'
* }
*/
// again the one liner:
console.log(Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {}));
如果有人想知道减少的作用是什么
// Will return Keys of object as an array (sorted if only numbers or single strings like a,b,c).
Object.keys(testObj)
// Chaining reduce to the returned array from Object.keys().
// Array.prototype.reduce() takes one callback
// (and another param look at the last line) and passes 4 arguments to it:
// accumulator, currentValue, currentIndex and array
.reduce((accumulator, currentValue) => {
// setting the accumulator (sorted new object) with the actual property from old (unsorted) object.
accumulator[currentValue] = testObj[currentValue];
// returning the newly sorted object for the next element in array.
return accumulator;
// the empty object {} ist the initial value for Array.prototype.reduce().
}, {});
如果需要的话,是一种衬板的说明:
Object.keys(testObj).reduce(
// Arrow function as callback parameter.
(a, c) =>
// parenthesis return! so we can safe the return and write only (..., a);
(a[c] = testObj[c], a)
// initial value for reduce.
,{}
);
为什么排序有点复杂:
简而言之,Object.keys()
将返回一个数组,其顺序与正常循环中的顺序相同:
const object1 = {
a: 'somestring',
b: 42,
c: false
};
console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]
Object.keys()返回一个数组,其元素为字符串 对应于直接在对象上发现的可枚举属性。 属性的顺序与循环给出的顺序相同 手动检查对象的属性。
侧注-您也可以在数组上使用Object.keys()
,请记住将返回索引:
// simple array
const arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
但是在这些示例中显示并不容易,现实世界中的对象可能包含数字,字母字符甚至符号(请不要这样做)。
下面是一个示例,将所有这些对象放在一个对象中:
// This is just to show what happens, please don't use symbols in keys.
const testObj = {
'1asc': '4444',
1000: 'a',
b: '1231',
'#01010101010': 'asd',
2: 'c'
};
console.log(Object.keys(testObj));
// output: [ '2', '1000', '1asc', 'b', '#01010101010' ]
现在,如果我们在输出上方的数组上使用Array.prototype.sort()
,则会更改:
console.log(Object.keys(testObj).sort());
// output: [ '#01010101010', '1000', '1asc', '2', 'b' ]
这是来自文档的引文:
sort()方法对数组中的元素进行排序并返回 数组。排序不一定是稳定的。默认排序顺序 是根据字符串Unicode代码点确定的。
无法保证排序的时间和空间复杂性 取决于实现。
您必须确保其中之一为您返回了所需的输出。在现实生活中,如果您一起使用API和数据库等不同的信息输入,人们往往会特别混淆。
那有什么大不了的?
每个程序员都应该理解两篇文章:
在计算机科学中,就地算法是不使用辅助数据结构来转换输入的算法。但是,可以为辅助变量保留少量的额外存储空间。算法执行时,输入通常会被输出覆盖。就地算法仅通过替换或交换元素来更新输入序列。非原位算法有时称为非原位或非原位。
所以基本上我们的旧数组将被覆盖!如果您出于其他原因要保留旧阵列,则这一点很重要。所以请记住这一点。
稳定的排序算法以相同的顺序对相同的元素进行排序 它们出现在输入中。排序某些数据时,仅一部分 确定排序顺序时会检查数据的多少。例如, 在右边的卡片排序示例中,卡片正在排序 按他们的排名,他们的衣服就被忽略了。这允许 多个不同正确排序版本的可能性 原始清单。稳定的排序算法可以选择以下一种, 根据以下规则:如果两个项目比较相等,例如 这两个5卡,则它们的相对顺序将被保留,这样 如果输入中一个先于另一个,则也将先于另一个 另一个在输出中。
在纸牌上进行稳定排序的示例。卡片分类时 按稳定排序的等级,两个5必须保持相同的顺序 在它们原来所在的排序输出中 用非稳定排序排序,则5可能以相反的顺序结束 在排序的输出中。
这表明排序正确,但是已更改。因此,在现实世界中,即使排序正确无误,我们也必须确保获得期望的结果!这也非常重要,请记住这一点。有关更多JavaScript示例,请查看Array.prototype.sort()-docs:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
答案 5 :(得分:19)
这是一个老问题,但是从Mathias Bynens&#39;回答,我已经制作了一个简短版本来对当前对象进行排序,没有太多开销。
Object.keys(unordered).sort().forEach(function(key) {
var value = unordered[key];
delete unordered[key];
unordered[key] = value;
});
代码执行后,&#34;无序&#34;对象本身将按字母顺序排序。
答案 6 :(得分:16)
使用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();
只是值得深思。
答案 7 :(得分:16)
这是1班轮
var data = { zIndex:99,
name:'sravan',
age:25,
position:'architect',
amount:'100k',
manager:'mammu' };
console.log(Object.entries(data).sort().reduce( (o,[k,v]) => (o[k]=v,o), {} ));
答案 8 :(得分:14)
假设它在VisualStudio调试器中有用,它显示无序对象属性。
(function(s){var t={};Object.keys(s).sort().forEach(function(k){t[k]=s[k]});return t})({b:2,a:1,c:3})
答案 9 :(得分:9)
function order(unordered)
{
return _.object(_.sortBy(_.pairs(unordered),function(o){return o[0]}));
}
如果你不相信你的浏览器保持密钥的顺序,我强烈建议依赖一个有序的键值配对数组。
_.sortBy(_.pairs(c),function(o){return o[0]})
答案 10 :(得分:8)
也许更优雅的形式:
/**
* Sorts a key-value object by key, maintaining key to data correlations.
* @param {Object} src key-value object
* @returns {Object}
*/
var ksort = function ( src ) {
var keys = Object.keys( src ),
target = {};
keys.sort();
keys.forEach(function ( key ) {
target[ key ] = src[ key ];
});
return target;
};
// Usage
console.log(ksort({
a:1,
c:3,
b:2
}));
&#13;
P.S。与ES6 +语法相同:
function ksort( src ) {
const keys = Object.keys( src );
keys.sort();
return keys.reduce(( target, key ) => {
target[ key ] = src[ key ];
return target;
}, {});
};
答案 11 :(得分:8)
function sortObjectKeys(obj){
return Object.keys(obj).sort().reduce((acc,key)=>{
acc[key]=obj[key];
return acc;
},{});
}
sortObjectKeys({
telephone: '069911234124',
name: 'Lola',
access: true,
});
答案 12 :(得分:7)
实际上我很惊讶地给出了30多个答案,但是没有一个人给出了完整的 deep 解决方案。有些解决方案比较浅,而有些解决方案却很深但是有缺陷(如果未定义,函数或符号将在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));
答案 13 :(得分:7)
现在是2019年,我们有2019年解决此问题的方法:)
Object.fromEntries(Object.entries({b: 3, a:8, c:1}).sort())
答案 14 :(得分:6)
的递归排序
:visible
答案 15 :(得分:4)
如前所述,对象是无序的。
...然而
您可能会发现这个习惯用法很有用:
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' ] ]
答案 16 :(得分:3)
只需使用lodash解压缩map并sortBy对第一个值并再次压缩它将返回排序键。
如果您希望sortby值更改对索引为 1 而不是 0
var o = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' };
console.log(_(o).toPairs().sortBy(0).fromPairs().value())
答案 17 :(得分:3)
这是一个基于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()
method ...
答案 18 :(得分:2)
@sindresorhus的一个伟大的项目称为排序键,效果很棒。
您可以在此处查看其源代码:
https://github.com/sindresorhus/sort-keys
或者您可以将它与npm:
一起使用$ npm install --save sort-keys
以下是他自述的代码示例
const sortKeys = require('sort-keys');
sortKeys({c: 0, a: 0, b: 0});
//=> {a: 0, b: 0, c: 0}
sortKeys({b: {b: 0, a: 0}, a: 0}, {deep: true});
//=> {a: 0, b: {a: 0, b: 0}}
sortKeys({c: 0, a: 0, b: 0}, {
compare: (a, b) => -a.localeCompare(b)
});
//=> {c: 0, b: 0, a: 0}
答案 19 :(得分:2)
我将一些Java枚举转移到javascript对象。
这些对象为我返回了正确的数组。如果对象键是混合类型(string,int,char),则存在问题。
var Helper = {
isEmpty: function (obj) {
return !obj || obj === null || obj === undefined || Array.isArray(obj) && obj.length === 0;
},
isObject: function (obj) {
return (typeof obj === 'object');
},
sortObjectKeys: function (object) {
return Object.keys(object)
.sort(function (a, b) {
c = a - b;
return c
});
},
containsItem: function (arr, item) {
if (arr && Array.isArray(arr)) {
return arr.indexOf(item) > -1;
} else {
return arr === item;
}
},
pushArray: function (arr1, arr2) {
if (arr1 && arr2 && Array.isArray(arr1)) {
arr1.push.apply(arr1, Array.isArray(arr2) ? arr2 : [arr2]);
}
}
};
function TypeHelper() {
var _types = arguments[0],
_defTypeIndex = 0,
_currentType,
_value;
if (arguments.length == 2) {
_defTypeIndex = arguments[1];
}
Object.defineProperties(this, {
Key: {
get: function () {
return _currentType;
},
set: function (val) {
_currentType.setType(val, true);
},
enumerable: true
},
Value: {
get: function () {
return _types[_currentType];
},
set: function (val) {
_value.setType(val, false);
},
enumerable: true
}
});
this.getAsList = function (keys) {
var list = [];
Helper.sortObjectKeys(_types).forEach(function (key, idx, array) {
if (key && _types[key]) {
if (!Helper.isEmpty(keys) && Helper.containsItem(keys, key) || Helper.isEmpty(keys)) {
var json = {};
json.Key = key;
json.Value = _types[key];
Helper.pushArray(list, json);
}
}
});
return list;
};
this.setType = function (value, isKey) {
if (!Helper.isEmpty(value)) {
Object.keys(_types).forEach(function (key, idx, array) {
if (Helper.isObject(value)) {
if (value && value.Key == key) {
_currentType = key;
}
} else if (isKey) {
if (value && value.toString() == key.toString()) {
_currentType = key;
}
} else if (value && value.toString() == _types[key]) {
_currentType = key;
}
});
} else {
this.setDefaultType();
}
return isKey ? _types[_currentType] : _currentType;
};
this.setTypeByIndex = function (index) {
var keys = Helper.sortObjectKeys(_types);
for (var i = 0; i < keys.length; i++) {
if (index === i) {
_currentType = keys[index];
break;
}
}
};
this.setDefaultType = function () {
this.setTypeByIndex(_defTypeIndex);
};
this.setDefaultType();
}
var TypeA = {
"-1": "Any",
"2": "2L",
"100": "100L",
"200": "200L",
"1000": "1000L"
};
var TypeB = {
"U": "Any",
"W": "1L",
"V": "2L",
"A": "100L",
"Z": "200L",
"K": "1000L"
};
console.log('keys of TypeA', Helper.sortObjectKeys(TypeA));//keys of TypeA ["-1", "2", "100", "200", "1000"]
console.log('keys of TypeB', Helper.sortObjectKeys(TypeB));//keys of TypeB ["U", "W", "V", "A", "Z", "K"]
var objectTypeA = new TypeHelper(TypeA),
objectTypeB = new TypeHelper(TypeB);
console.log('list of objectA = ', objectTypeA.getAsList());
console.log('list of objectB = ', objectTypeB.getAsList());
Types:
var TypeA = {
"-1": "Any",
"2": "2L",
"100": "100L",
"200": "200L",
"1000": "1000L"
};
var TypeB = {
"U": "Any",
"W": "1L",
"V": "2L",
"A": "100L",
"Z": "200L",
"K": "1000L"
};
Sorted Keys(output):
Key list of TypeA -> ["-1", "2", "100", "200", "1000"]
Key list of TypeB -> ["U", "W", "V", "A", "Z", "K"]
答案 20 :(得分:2)
在保留引用的同时递归地排列键。
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}
答案 21 :(得分:2)
简单易读的代码段,使用lodash。
只有在调用sortBy时才需要将键放在引号中。它不必在数据本身中引用。
_.map( _.sortBy(myObj, "key") , "value");
另外,你要映射的第二个参数是错误的。它应该是一个函数,但使用pluck更容易。
{{1}}
答案 22 :(得分:2)
<强>解决方案:强>
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()方法对键数组进行排序,该方法对数组的元素进行排序(无需将它们分配给新变量)。
对键进行排序后,您可以逐个使用它们来访问旧对象的内容以填充新对象(现在已对其进行排序)。
以下是该过程的示例(您可以在目标浏览器中对其进行测试):
/**
* Returns a copy of an object, which is ordered by the keys of the original object.
*
* @param {Object} object - The original object.
* @returns {Object} Copy of the original object sorted by keys.
*/
function getSortedObject(object) {
// New object which will be returned with sorted keys
var sortedObject = {};
// Get array of keys from the old/current object
var keys = Object.keys(object);
// Sort keys (in place)
keys.sort();
// Use sorted keys to copy values from old object to the new one
for (var i = 0, size = keys.length; i < size; i++) {
key = keys[i];
value = object[key];
sortedObject[key] = value;
}
// Return the new object
return sortedObject;
}
/**
* Test run
*/
var unsortedObject = {
d: 4,
a: 1,
b: 2,
c: 3
};
var sortedObject = getSortedObject(unsortedObject);
for (var key in sortedObject) {
var text = "Key: " + key + ", Value: " + sortedObject[key];
var paragraph = document.createElement('p');
paragraph.textContent = text;
document.body.appendChild(paragraph);
}
注意: 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;
};
}
答案 23 :(得分:2)
这是我进行JSON排序所需的轻量级解决方案。
function sortObj(obj) {
if (typeof obj !== "object" || obj === null)
return obj;
if (Array.isArray(obj))
return obj.map((e) => sortObj(e)).sort();
return Object.keys(obj).sort().reduce((sorted, k) => {
sorted[k] = sortObj(obj[k]);
return sorted;
}, {});
}
答案 24 :(得分:2)
如果您有嵌套对象或嵌套数组对象,请使用此代码。
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){
var val = obj[key];
if(val instanceof Array){
//do for loop;
var arr = [];
jQuery.each(val,function(){
arr.push(sortObjectByKey(this));
});
val = arr;
}else if(val instanceof Object){
val = sortObjectByKey(val)
}
sorted_obj[key] = val;
});
return sorted_obj;
};
答案 25 :(得分:1)
只是为了简化它并使Matt Ball的答案更加清晰
//your object
var myObj = {
b : 'asdsadfd',
c : 'masdasaf',
a : 'dsfdsfsdf'
};
//fixed code
var keys = [];
for (var k in myObj) {
if (myObj.hasOwnProperty(k)) {
keys.push(k);
}
}
keys.sort();
for (var i = 0; i < keys.length; i++) {
k = keys[i];
alert(k + ':' + myObj[k]);
}
&#13;
答案 26 :(得分:1)
纯JavaScript回答对对象进行排序。这是我所知道的唯一能够处理负数的答案。此函数用于排序数字对象。
输入 obj = {1000:{}, - 1200:{},10000:{},200:{}};
function osort(obj) {
var keys = Object.keys(obj);
var len = keys.length;
var rObj = [];
var rK = [];
var t = Object.keys(obj).length;
while(t > rK.length) {
var l = null;
for(var x in keys) {
if(l && parseInt(keys[x]) < parseInt(l)) {
l = keys[x];
k = x;
}
if(!l) { // Find Lowest
var l = keys[x];
var k = x;
}
}
delete keys[k];
rK.push(l);
}
for (var i = 0; i < len; i++) {
k = rK[i];
rObj.push(obj[k]);
}
return rObj;
}
输出将是一个按照这些数字排序的对象,其中新键从0开始。
答案 27 :(得分:1)
最好的方法是
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> ]
由于原因而在结尾处留空插槽,因为您的第一个索引是1而不是0。您可以使用.length--或.pop()删除该空插槽。
或者,如果您想借用.reverse并在同一对象上调用它,则它必须是一个类似于数组的对象。也就是说,它需要一个length属性:
Array.prototype.reverse.call({1:'banana', 2:'apple',
3:'orange', length:4});
// {0:"orange", 1:"apple", 3:"banana", length:4}
注意,它将返回相同的全数组对象对象,因此它不是真正的数组。然后,您可以使用Delete删除length属性。
答案 28 :(得分:1)
// if keys are char/string
const sortObject = (obj) => Object.fromEntries(Object.entries(obj).sort( ));
let obj = { c: 3, a: 1 };
obj = sortObject(obj)
// if keys are numbers
const sortObject = (obj) => Object.fromEntries(Object.entries(obj).sort( (a,b)=>a-b ));
let obj = { 3: 'c', 1: 'a' };
obj = sortObject(obj)
答案 29 :(得分:0)
不确定这是否能回答问题,但这就是我所需要的。
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) { ... } )
答案 30 :(得分:0)
Object.keys(unordered).sort().reduce(
(acc,curr) => ({...acc, [curr]:unordered[curr]})
, {}
)
答案 31 :(得分:0)
一行:
Object.entries(unordered)
.sort(([keyA], [keyB]) => keyA > keyB)
.reduce((obj, [key,value]) => Object.assign(obj, {[key]: value}), {})
答案 32 :(得分:-1)
这是一种单行解决方案(不是最有效的解决方案,但是当涉及到像您的示例这样的瘦对象时,我宁愿使用本机JS函数,然后弄乱草率循环)
const unordered = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
const ordered = Object.fromEntries(Object.entries(unordered).sort())
console.log(ordered); // a->b->c