2017-11-14 9 views
3

キリル文字で書かれた文字列の並べ替えに問題がありました(アクセント付き)。次の解決方法では、文字列の先頭に分音記号の有無を区別して文字列をソートします。キリル文字のアクセント記号のソート

function sorting(){ 
    let words = document.querySelectorAll(".dictionary"); 
    let unsorted = []; 
    let collator = new Intl.Collator('ru', {sensitivity: 'base'}); 
    words.forEach(s => { 
     unsorted.push(s.textContent); 
    }); 
    unsorted.sort(collator.compare); 
    unsorted.forEach(s => { 
     document.write("<p>" + s + "</p>"); 
    }); 
} 

EDIT
これが配列であるソート前:
[..., 'áвтор', ..., 'авиабилéт', ..., 'янтáрный', ..., 'Áвстрия', 'áвтор', 'автостóп'];
これは、ソートした後です:
["авиабилéт", "автостóп", ..., "янтáрный", ..., "Áвстрия", "áвтор"]
これは私が
['авиабилéт', 'Áвстрия', 'áвтор', 'автостóп', ..., 'янтáрный', ...];

+0

ソートする文字列を含む自己完結型の例を提供できますか?また、 'Intl.Collat​​or.supportedLocalesOf( 'ru')'が返すものをチェックしましたか?どのブラウザ(およびバージョン)を使用していますか? – jcaron

+0

ソート後に値を共有することはできますか? – gurvinder372

+0

問題をよく説明する単語のリストを追加しました。この問題は、分音記号で始まる言葉にのみ関係しているようです。 'Intl.Collat​​or.supportedLocalesOf( 'ru')'は '[" ru "]'を返します。私はChrome 62を使用しています。 – enk1

答えて

0

いくつかの調査の後、私はそれがICUプロジェクトかCLDRライブラリのいずれかのバグであると信じています。

通常、アクセント付きの文字は結合され、1文字として保持されるため、キリル文字 'a'とアクセント付きのラテン 'a'は同じ文字になります。標準ソートが失敗します。私は

  • .toLowerCase()「は基本文字+アクセント文字」
  • .replace()
  • 使用して、任意の区別符号chatactersを除去する一連のに単一文字を展開.normalize('NFD')を用いた

    1. ノーマライズ場合提案回避策として

      標準.sort()

    私はそれがうまくいくはずだと信じています。

  • +0

    ありがとう!それは正常に動作します! :) – enk1

    1

    あなたが持っていない持っていたいものですにsensitivityを提供3210。おそらくデフォルト値は 'variant'です(私はChromeのコンソールで試しました)。ベースが必要です。

    +0

    '{sensitivity: 'base'}'を追加しましたが、結果は変わりません。 – enk1

    +0

    @enk1 Chrome @ Windows 7で私のために動作します – skyboyer

    +0

    'var a = new Intl.Collat​​or( 'ru'、{sensitivity: 'base'}))。 ['вотор'、 'авиабилет'、 'янтáрный'、 'Áвстрия'、 'автор'、 'автостóп']。 => ["авиабилéт"、 "автостóп"、 "янтáрный"、 "Áвстрия"、 "áвтор"、 "áвтор"] ' – skyboyer

    関連する問題