7

こんにちは、node.js の初心者です。今日は次のコードを試しました。

var fs, arr;
var dir, str;
var cont, item;

fs=require('fs');
cont=fs.readFileSync('unsort.txt').toString();
arr=cont.split('\n');
arr.sort();

for(str=arr.shift();str&&(item=arr.shift());)
    str+='\n'+item;
fs.writeFileSync('sort_by_script.txt', str);

上記の node.js コードは、node.exe のディレクトリからファイルを文字列として読み取ります。文字列を改行 ('\n') で分割して配列を取得します。配列をソートし、ソートされた配列をファイルに出力します。そのため、スクリプトは全体としてファイルを読み取り、エントリを並べ替え、並べ替えられたエントリを別のファイルに保存します。問題は、ソート順が正しくないことです。MS Excel を使用して unsort.txt の内容を手動で並べ替えてみたところ、正しい並べ替え順序が得られました。arr.sort() が正しく機能しない理由を教えてください。unsort.txt、sort_by_script.txt、sort_by_ms_excel.txt、node.exe をパッケージ [Sort.rar][1] でダウンロードできます。

注 : unsort.txt には番号がありません。すべてアルファベットのみです。

unsort.txt の例:

appjs
gbi
node
frame
require
process
module
WebSocket
webkitAudioContext
webkitRTCPeerConnection
webkitPeerConnection00
webkitMediaStream
MediaController
HTMLSourceElement
TimeRanges
4

2 に答える 2

11

カスタム検索関数を渡さない場合、ソート関数は語彙的にソートし、数値が文字列にキャストされるため、たとえば "10" が "3" の前に表示されます。したがって、文字列はソートされます。

アイテムの順序を決定するカスタム関数をソート関数に渡すことができます。数値の場合、これは例になります(数値にキャスト/解析しない場合、例の数値は文字列になるので注意してください):

var numsort = function (a, b) {
    return a - b;
}

var numbers = new Array(20, 2, 11, 4, 1);

var result = numbers.sort(numsort);

文字列の別の例:

var sortstring = function (a, b)    {
    a = a.toLowerCase();
    b = b.toLowerCase();
    if (a < b) return 1;
    if (a > b) return -1;
    return 0;
}
于 2013-04-04T07:10:52.693 に答える
4

私は使うだろう

arr.sort((obj1, obj2) => {
            return obj1.localeCompare(obj2);
        });

これで問題が解決する可能性が高くなります。

于 2017-08-24T12:59:26.587 に答える