情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsで配列を非同期的にソートする

配列を非同期的にソートするにはasyncモジュールのasync.sortBy関数を使用します。

この関数は配列の要素を配列の要素から算出された値の昇順にソートします。

なお、ソート処理の実行中にエラーが発生した場合にはそれ以降のソート処理の実行は行われません。

async.sortBy関数

var async = require('async');

async.sortBy(['xxx', 'yyy', 'zzz'], function (item, callback) {
    callback(null, 'aaa');
    //or
    callback(new Error('bbb'), null);
}, function (err, array) {
});

第1引数

第1引数に配列を指定します。あるいは、配列以外のイテラブルを指定することもできます。

第2引数

第2引数に配列の要素からソートに使用される値を算出する処理を関数として指定します。

この関数の第1引数は配列の要素の値であり、第2引数はコールバック関数です。

処理が完了した場合や処理の実行中にエラーが発生した場合には必ずこのコールバック関数を呼び出さなければなりません。

このコールバック関数の第1引数にはエラーオブジェクト(エラーが発生しなかった場合にはnull)を指定し、第2引数にはソートに使用される値(エラーが発生した場合にはnull)を指定します。

第3引数

第3引数に配列のソートが完了したか、ソート処理の実行中にエラーが発生した場合に呼び出されるコールバック関数を指定します。

この関数の第1引数はエラーオブジェクトであり、第2引数はソート後の配列です。

この引数は指定しなくても構いません。

サンプルコード1

数値を昇順と降順にソートする例です。

async-sort-by.js

var async = require('async');
var util = require('util');

var xs = [7, 9, 6, 3, 4, 0, 5, 2, 1, 8];
async.sortBy(xs, function (item, callback) {
    setTimeout(function () {
        util.log(item);
        callback(null, item);
    }, Math.random() * 1000);
}, function (err, results) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log(results);
        async.sortBy(xs, function (item, callback) {
            setTimeout(function () {
                util.log(item);
                callback(null, -item);
            }, Math.random() * 1000);
        }, function (err, results) {
            if (err) {
                console.error(err);
                process.exit(1);
            }
            else {
                console.log(results);
            }
        });
    }
});

使用パッケージ

  • Async.js
    npm install asyncでインストールします。

実行結果

C:\work\node>node async-sort-by.js
6 Jun 12:19:46 - 7
6 Jun 12:19:46 - 4
6 Jun 12:19:47 - 2
6 Jun 12:19:47 - 8
6 Jun 12:19:47 - 1
6 Jun 12:19:47 - 0
6 Jun 12:19:47 - 3
6 Jun 12:19:47 - 9
6 Jun 12:19:47 - 5
6 Jun 12:19:47 - 6
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
6 Jun 12:19:47 - 9
6 Jun 12:19:47 - 7
6 Jun 12:19:47 - 5
6 Jun 12:19:48 - 2
6 Jun 12:19:48 - 0
6 Jun 12:19:48 - 4
6 Jun 12:19:48 - 8
6 Jun 12:19:48 - 1
6 Jun 12:19:48 - 3
6 Jun 12:19:48 - 6
[ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ]

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js