伙计们,我很震惊!当然,所有答案都有些陈旧,但是没有人甚至提到排序的稳定性!因此,请允许我尽力回答问题本身,并在此处进行详细说明。因此,我现在要道歉,这将是很多阅读的内容。
由于是2018年,所以我只会使用ES6,因此可在MDN文档中找到Polyfills,我将在给定的部分进行链接。
回答问题:
如果键只是数字,则可以安全地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()-文档:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort