2016-07-12 1 views
2

Reactjs 및 underscore.js를 사용하여 응용 프로그램을 개발 중입니다. 문자열 인 name을 사용하여 목록을 정렬하려고합니다. 그러나 이름에 숫자가 포함되어 있으므로 정렬이 올바르지 않습니다. 여기 내 코드와 그 결과의 예는 다음과 같습니다알파벳과 숫자가 포함 된 이름 propery를 사용하여 객체 배열 정렬

items= _.sortBy(items, function (item) { 
    return item.name.toLowerCase() 
}); 

결과 :

S1.2M (FA) 
S10.1M 
S10.2M 
S10.4M 
S11 (GR14) 
S2 (DT) 
S3.1M (GR17) 

하지만 결과를 원하는, 이렇게 될 :

S1.2M (FA) 
S2 (DT) 
S3.1M (GR17) 
S10.1M 
S10.2M 
S10.4M 
S11 (GR14) 

내가 달성 할 수있는 방법이 ?

답변

2

짧은 대답 : 당신이 찾는 용어는 '자연 정렬'이며 쉽게 찾을 수있는 것은 아닙니다.

언더 코어는 비교할 요소 2 개를 제공하지 않지만 비교할 측정 값을 제공하기 때문에 더 어려워집니다.

당신은 많은 예를 찾을 수는 :

Javascript : natural sort of alphanumerical strings

Underscore.js sort an array of objects alphanumerically

당신이 underscorejs 달성 할 수있는 가장 가까운 뭔가 같은 :

_.sortBy(items, function (a) { 
    return parseInt(a.match(/\d+/)[0]); 
}); 

은 단순히 문자열의 첫 번째 숫자 (숫자 아님)를 비교합니다.

+0

감사합니다. Javascript의 솔루션을 사용하여 끝났습니다. 즉 자연 정렬 된 영숫자 문자열입니다. – user261002

2

sortBy()를 두 번 사용하면됩니다.

var items = [ 
 
      {"name":"S1.2M (FA)"}, 
 
      {"name":"S10.1M"}, 
 
      {"name":"S10.2M"}, 
 
      {"name":"S10.4M"}, 
 
      {"name":"S11 (GR14)"}, 
 
      {"name":"S2 (DT)"}, 
 
      {"name":"S3.1M (GR17)"} 
 
     ] 
 
     
 
     //sort by alphabetical order 
 
     items = _.sortBy(items, function (item) { 
 
      return item.name.toLowerCase() 
 
     }) 
 

 
     //sort while ignoring first character 
 
     items = _.sortBy(items, function(item) { 
 
     \t return item.name.substring(1); 
 
     }); 
 

 

 
_.each(items, function(item) { 
 
    $('ul').append('<li>'+item.name+'</li>') 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js"></script> 
 

 
<ul></ul>

나는이 깨끗한 방법으로 작성할 수 있습니다 확신합니다. 나중에 시간이 있으면 다시 시도해 보도록하겠습니다.하지만이 방법은 효과가 있습니다.

+1

멋진 트릭이지만 두 가지 이유로 작동하지 않습니다. 첫째로 substring (1)에 의한 정렬은 여전히 ​​숫자가 아닌 영문자입니다. 둘째, 최종 정렬은 동등한 요소를 제외하고 순서를 완전히 무시합니다. 동등한 요소 그룹 내에서의 상대적인 순서는 이전의 정렬에서 보존됩니다. 최종 정렬은 첫 번째 문자로 이루어져야하며 예를 들어. 숫자로 정렬 된 S는 숫자 부분으로 정렬해야합니다. 모든 S가 동일하게 간주되고 상대 순서가 유지되도록 최종 정렬에서 첫 글자를 _just_로 정렬하는 것이 중요합니다. – tom