2017-05-11 11 views
2

私は、文字、整数、文字で構成される文字列をソートして配列しようとしています。ここに私がやっていることです:特殊文字と整数を無視して配列を並べ替える?

var vList =["IEC - 62877-1 ", "IEC - 60622 ", "CAN/CSA - F382-M89 (2014) ", "Telcordia - GR-3150-CORE ", "UL - 1973"]; 

vList.sort(function(a,b) { 
return a.split(' - ')[0] - b.split(' - ')[0]; 
}); 

print(vList) 

アイデアは、文字列の要素のみ最初の文字を使用してアルファベット順に配列をソートすることです:「IEC」、「CAN」を、「Telecordia」、「UL」 。

配列は次のようになります。

vList = ["CAN/CSA - F382-M89 (2014)", "IEC - 62877-1 ", "IEC - 60622 ","Telcordia - GR-3150-CORE ", "UL - 1973"]; 
+0

文字列を比較しているときに、比較関数として減算を使用することはできません。それは数字だけで動作します。 – Barmar

+0

各引数の最初の単語を取得し、 'if'文を使って' -1'、 '0'、または' 1'を返します。 – Barmar

答えて

0

あなたはsort()方法は、配列in placeの要素をソートし、配列を返すArray#sort

のソート機能で構築を使用することができます。並べ替えは必ずしもstableではありません。デフォルトのソート順は、文字列のUnicodeコードポイントに従います。

var vList =["IEC - 62877-1 ", "IEC - 60622 ", "CAN/CSA - F382-M89 (2014) ", "Telcordia - GR-3150-CORE ", "UL - 1973"]; 
 

 
vList.sort(); 
 

 
console.log(vList);

sorting with mapと元の順序を維持する案。

var vList =["IEC - 62877-1 ", "IEC - 60622 ", "CAN/CSA - F382-M89 (2014) ", "Telcordia - GR-3150-CORE ", "UL - 1973"], 
 
    mapped = vList.map(function(el, i) { 
 
     return { index: i, letter: el[0] }; 
 
    }); 
 

 
mapped.sort(function(a, b) { 
 
    return a.letter.localeCompare(b.letter) || a.index - b.index; 
 
}); 
 

 
// container for the resulting order 
 
var result = mapped.map(function(el){ 
 
    return vList[el.index]; 
 
}); 
 

 
console.log(result);

+0

OPは、リストではなく、最初の文字に基づいて並べ替えることを望んでいます。したがって、IEC - 62877-1はBEFORE IEC 60622をソートする必要がありますが、デフォルトソートでは発生しません。 –

+0

@PeterLaBanca、あなたが手紙を受け取っても、あなたは不安定な結果を得ます。数字の部分を使わずに分割をする利点は何ですか? –

+0

私はOPが彼らのポストに書いたことのちょうど外に出ています。彼らはある種の出来事が起こることを望んでいました。なぜそんなにソートする必要があるのか​​分かりません。 –

0

あなたは、文字列全体始まる最初の文字列の文字だけでソートを見て、とされていない場合は、あなただけのソート機能でlocaleCompareを行うことができます。それはまだしようとしますので、

var vList =["IEC - 62877-1 ", "IEC - 60622 ", "CAN/CSA - F382-M89 (2014) ", "Telcordia - GR-3150-CORE ", "UL - 1973"]; 
 

 
vList.sort(function(a, b) { 
 
    var string1 = /[a-zA-Z]+/.exec(a); 
 
    var string2 = /[a-zA-Z]+/.exec(b); 
 
    if(string1 && string2) { 
 
     return string1[0].localeCompare(string2[0]); 
 
    } else { 
 
     return a - b 
 
    } 
 
}) 
 

 
console.log(vList);

ただ、それはあなたが並べ替えしようとしているエントリのいずれかが「62877から1 IEC」であれば、あなたが期待していない可能性がありますかの方法で行動することに注意して番号に従っていても、IECに基づいてソートします。また、スラッシュのために "CAN/CSA"項目に "CAN"だけを使用していますが、とにかくそのようにしたいと思うようです。

0

あなたのソリューションはあなたのケースにとって非常に特別です。しかし、あなたは文字列を正規表現で記述するか、あなたのように分割したり、他のものを記述しなければなりません。

vList.sort(function(a,b) { 
    return a.split(' - ')[0].localCompare(b.split(' - ')[0]); 
}); 

これは、文字列のローカル比較(ブラウザ言語への比較)を使用し、正しい値を返します。

+1

ニースのアプローチ。しかし、それは文字の周りの空白を想定しています。よりロバストな解決法は、正規表現/ \ s * -/s * /を分割する代わりに使用するので、空白は重要ではありません。 –

+0

そうです。それは難しい部分だと思います。フェリペのバレステロスを助けることはできません。パターンを知らないので、良い正規表現を与えることはできません。しかし、あなたのソリューションはより適切です。 – Guybrush

0

var vList =["IEC - 62877-1 ", "IEC - 60622 ", "CAN/CSA - F382-M89 (2014) ", "Telcordia - GR-3150-CORE ", "UL - 1973"]; 
 

 
vList.sort(function(a,b) { 
 
if(a.split('-')[0]> b.split('-')[0]) 
 
    return 1; 
 
else if(a.split('-')[0]< b.split('-')[0]) 
 
    return -1; 
 
return 0; 
 
}) 
 

 
print(vList);

これは正常に動作する必要があります。減算の代わりにすべてをうまく使いました。それ以上の値を使用して1より大きい値を返します。それに応じて-1 & 0を返します。

+0

文字列を比較するための組み込みソリューション 'localCompare'があります。独自の比較の代わりに使用する必要があります。 – Guybrush

関連する問題