얘들 아 나는 비 유적으로 충격을 받았습니다! 모든 대답이 다소 오래되었지만 정렬의 안정성에 대해서는 아무도 언급하지 않았습니다! 저와 함께 견딜 수 있도록 최선을 다해 질문에 답변하고 여기에 자세히 설명하겠습니다. 이제 사과하겠습니다. 읽을 거리가 많습니다.
2018 년부터 ES6 만 사용하므로 Polyfill은 모두 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 () 메서드는 배열의 요소를 적절하게 정렬하고 배열을 반환합니다. 정렬이 반드시 안정적인 것은 아닙니다. 기본 정렬 순서는 문자열 유니 코드 코드 포인트에 따릅니다.
정렬의 시간 및 공간 복잡성은 구현에 따라 다르므로 보장 할 수 없습니다.
그들 중 하나가 원하는 결과를 반환하는지 확인해야합니다. 실제 예제에서 사람들은 API 및 데이터베이스와 같은 서로 다른 정보 입력을 함께 사용하는 경우 상황을 정리하는 경향이 있습니다.
그래서 큰 문제는 무엇입니까?
모든 프로그래머가 이해해야 할 두 가지 기사가 있습니다.
내부 알고리즘 :
컴퓨터 과학에서 인플레 이스 알고리즘은 보조 데이터 구조를 사용하지 않고 입력을 변환하는 알고리즘입니다. 그러나 보조 변수에는 소량의 추가 저장 공간이 허용됩니다. 알고리즘이 실행될 때 일반적으로 입력이 출력에 의해 덮어 쓰기됩니다. 인플레 이스 알고리즘은 요소 교체 또는 교체를 통해서만 입력 시퀀스를 업데이트합니다. 제자리에 있지 않은 알고리즘을 제자리 안 또는 제자리라고도합니다.
기본적으로 기존 배열을 덮어 씁니다! 다른 이유로 기존 어레이를 유지하려는 경우에 중요합니다. 따라서 이것을 명심하십시오.
정렬 알고리즘
안정적인 정렬 알고리즘은 입력에 나타나는 것과 동일한 순서로 동일한 요소를 정렬합니다. 일부 종류의 데이터를 정렬 할 때는 정렬 순서를 결정할 때 데이터의 일부만 검사합니다. 예를 들어, 오른쪽에있는 카드 정렬 예에서 카드는 순위별로 정렬되며 해당 수트는 무시됩니다. 이를 통해 원래 목록의 여러 가지 올바르게 정렬 된 버전을 사용할 수 있습니다. 안정적인 정렬 알고리즘은 다음 규칙에 따라 다음 중 하나를 선택합니다. 두 개의 5 카드와 같이 두 항목이 동일하게 비교되는 경우 상대 순서가 유지되므로 입력에서 다른 항목보다 먼저 오면 출력에서 다른 것보다 먼저 나옵니다.
카드 놀이에서 안정적인 종류의 예. 카드가 안정적인 정렬로 순위별로 정렬 될 때 두 5는 원래 있던 정렬 된 출력에서 동일한 순서로 유지되어야합니다. 불안정한 정렬로 정렬 된 경우 5는 반대 방향으로 끝날 수 있습니다. 정렬 된 출력에서 순서.
이것은 정렬이 옳지 만 변경되었음을 나타냅니다. 따라서 현실 세계에서 정렬이 정확하더라도 우리가 기대하는 것을 얻도록해야합니다! 이것도 명심하십시오. 더 많은 JavaScript 예제는 Array.prototype.sort ()-docs를 참조하십시오 . https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort