2016-11-04 3 views
2

빈 문자열, 숫자, "무한", "- 무한"및 "NaN"을 포함하는 배열을 정렬하려고합니다. 문자열의 형태로 모든 값을 받고 있으므로 빈 문자열 인 inf와 nan에 대해서는 sort가 예상대로 작동하지 않습니다. 내 정렬 기능을 오름차순과 내림차순으로 모두 사용자 정의 할 수있는 방법이 있습니까?빈 문자열, NaN, 숫자 및 무한으로 배열을 정렬하는 방법

+1

? 익명 함수는'.name'을 가지지 않습니다; 어떻게 함수가 호출됩니까? 왜'String'''''''''''''''''''''''''''은''Infinity'' 또는''String''''''''''''NaN'' – guest271314

+0

왜 현재 논리를 확장하고 문자열의 값에 따라'result'에 적절한 값을 할당하지 않습니까? –

+0

[Infinity] (https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Infinity), [NaN] (https://developer.mozilla.org/)와 같은 실제 전역을 사용하지 않는 이유는 무엇입니까? fr/docs/Web/JavaScript/Reference/Objets_globaux/NaN) 문자열을 사용하는 대신? – soywod

답변

0

편집 : 귀하의 의견에 따라 "" < "-inf" < "Nan" < "inf" < ... < -1 < 0 < 1 < .... order 어레이를 수정하여이를 변경할 수 있습니다.

배열에 order 배열에없는 요소가 포함되어 있으면이 코드가 제대로 작동하지 않습니다. 이를 위해 가드를 설정하거나 배열에 다른 특수 요소 (예 : 0)를 추가 할 수 있습니다.

또한 참고 NaNInfinity (문자열 리터럴이 아님)은 자바 스크립트의 숫자이기도합니다. 이 코드를 사용하면 번호 옆에 주문됩니다.

var basicCompare = function (a, b) { 
    if (a > b) return 1; 
    if (a < b) return -1; 
    return 0; 
} 

var compare = function (a, b) { 
    // 0 represents numbers. 
    var order = ["", "-inf", "Nan", "inf", 0], 
     orderOfNumber = order.indexOf(0), 
     orderOfA = typeof(a) === "number" ? orderOfNumber : order.indexOf(a), 
     orderOfB = typeof(b) === "number" ? orderOfNumber : order.indexOf(b); 

    if (orderOfA === orderOfNumber & orderOfB === orderOfNumber) { 
     // They are both numbers, use regular comparison. 
     return basicCompare(a, b); 
    } 

    // They are not both numbers, so use the axiomatic order. 
    return basicCompare(orderOfA, orderOfB) 
} 

array.sort(compare); 
+0

문자열 비교를 통해 정렬하고자합니다. 이 값을 파싱하고 싶지 않습니다. 그래서 배열에는 문자열과 유효한 숫자가 포함됩니다. 습득하려고하는 순서는 arr = [ "", "-inf", "Nan", "inf", -2, 0, 2, 3]입니다. – nikitha

+0

나는 그 순서를 사용하는 공리를 편집했다. 제발, 코드를 읽고 그것에 대해 아무것도 묻지 않아도됩니다. 나는 그것이 당신이 의미하는 바를한다고 생각합니다. – GMunguia

+0

이것은 항상 "", inf, nan을 문자열로 정렬하고 각 순서에 따라 숫자를 그룹화합니까? – nikitha

1

개체를 사용하여 정렬 순서를 지정하고 원하는 항목을 원하는 위치로 이동할 수 있습니다.

결과를 예상 무엇

var array = ["", 2, 3, 0, "inf", "-inf", "Nan", -1, -100000]; 
 

 
array.sort(function (a, b) { 
 
    var order = { "": -4, "-inf": -3, "Nan": -2, "inf": -1 }; 
 
    return (order[a] || 0) - (order[b] || 0) || a - b; 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

내 버전이 좋습니까? 귀하의 CSS 주셔서 감사합니다 :)? –

+0

아니요, 숫자는 0으로 그룹화 된 다음 실제 델타로 그룹화됩니다. '-100000'으로 편집하십시오. –

+0

@NinaScholz 아, 알겠습니다. 'a'와'b'가 모두 "inf"인 경우와 같이, 때때로 compare 함수에서'0' 대신에'NaN'을 반환하는 것이 문제인지 알고 있습니까? – Paulpro

관련 문제