好きなテキスト順でソートする(いろは順から)
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
なんかいろは順でテキストソートするのが流行ってる?みたいなので
いろは順しかできないというのもあれなので 好きな順にソートできるようにします
いきなりですが完成品がこちらです
order には文字の順番を入れておきます
文字数が異なる aa と aab などは文字数が少ないほうが前に来るようになります
では使ってみます
まずは アルファベットで逆順 zyxwv... という並びにします
ちゃんと逆順ですね
"zz" は "zzzz" より短いので先にあります
そのまま書くのも長いのでメソッド化しておきます
では いろは順にしてみます
といっても 「いろはにほへと」 程度しか知らないのでこの 7 文字だけ使います
ちゃんと並んでます
好きな文字順にするのってけっこう簡単なんですよ
いきなりですが完成品がこちらです
data.slice().sort((a, b) => {
for(var i=0,l=Math.min(a.length, b.length);i<l;i++){
var ia = order.indexOf(a[i])
var ib = order.indexOf(b[i])
if(ia < ib) return -1
if(ia > ib) return 1
}
if(a.length < b.length) return -1
if(a.length > b.length) return 1
return 0
})
for(var i=0,l=Math.min(a.length, b.length);i<l;i++){
var ia = order.indexOf(a[i])
var ib = order.indexOf(b[i])
if(ia < ib) return -1
if(ia > ib) return 1
}
if(a.length < b.length) return -1
if(a.length > b.length) return 1
return 0
})
order には文字の順番を入れておきます
文字数が異なる aa と aab などは文字数が少ないほうが前に来るようになります
では使ってみます
まずは アルファベットで逆順 zyxwv... という並びにします
var order = "abcdefghijklmnopqrstuvwxyz".split("").reverse().join("")
order
// zyxwvutsrqponmlkjihgfedcba
var data = [
"zz",
"a",
"iii",
"aba",
"yt",
"aaa",
"aba",
"bz",
"v",
"cz",
"abb",
"zzzz",
"gjh",
"iii",
"oqa",
"byba",
]
data.slice().sort((a, b) => {
for(var i=0,l=Math.min(a.length, b.length);i<l;i++){
var ia = order.indexOf(a[i])
var ib = order.indexOf(b[i])
if(ia < ib) return -1
if(ia > ib) return 1
}
if(a.length < b.length) return -1
if(a.length > b.length) return 1
return 0
})
// ["zz", "zzzz", "yt", "v", "oqa", "iii", "iii", "gjh", "cz", "bz", "byba", "a", "abb", "aba", "aba", "aaa"]
order
// zyxwvutsrqponmlkjihgfedcba
var data = [
"zz",
"a",
"iii",
"aba",
"yt",
"aaa",
"aba",
"bz",
"v",
"cz",
"abb",
"zzzz",
"gjh",
"iii",
"oqa",
"byba",
]
data.slice().sort((a, b) => {
for(var i=0,l=Math.min(a.length, b.length);i<l;i++){
var ia = order.indexOf(a[i])
var ib = order.indexOf(b[i])
if(ia < ib) return -1
if(ia > ib) return 1
}
if(a.length < b.length) return -1
if(a.length > b.length) return 1
return 0
})
// ["zz", "zzzz", "yt", "v", "oqa", "iii", "iii", "gjh", "cz", "bz", "byba", "a", "abb", "aba", "aba", "aaa"]
ちゃんと逆順ですね
"zz" は "zzzz" より短いので先にあります
そのまま書くのも長いのでメソッド化しておきます
Array.prototype.textSort = function(str_order){
return this.sort((a, b) => {
for(var i=0,l=Math.min(a.length, b.length);i<l;i++){
var ia = str_order.indexOf(a[i])
var ib = str_order.indexOf(b[i])
if(ia < ib) return -1
if(ia > ib) return 1
}
if(a.length < b.length) return -1
if(a.length > b.length) return 1
return 0
})
}
return this.sort((a, b) => {
for(var i=0,l=Math.min(a.length, b.length);i<l;i++){
var ia = str_order.indexOf(a[i])
var ib = str_order.indexOf(b[i])
if(ia < ib) return -1
if(ia > ib) return 1
}
if(a.length < b.length) return -1
if(a.length > b.length) return 1
return 0
})
}
では いろは順にしてみます
といっても 「いろはにほへと」 程度しか知らないのでこの 7 文字だけ使います
;["いはへ", "ほいろに", "ろはとい", "いろ", "ほいろ", "ろい", "ほいに", "いろはに", "ろと"].textSort("いろはにほへと")
// ["いろ", "いろはに", "いはへ", "ろい", "ろはとい", "ろと", "ほいろ", "ほいろに", "ほいに"]
// ["いろ", "いろはに", "いはへ", "ろい", "ろはとい", "ろと", "ほいろ", "ほいろに", "ほいに"]
ちゃんと並んでます
好きな文字順にするのってけっこう簡単なんですよ