15

indexedDBから取得した結果を並べ替えたい。
各レコードの構造は{id、text、date}です。ここで、「id」はkeyPathです。

結果を日付で並べ替えたい。

私の現在のコードは次のとおりです。

  var trans = db.transaction(['msgs'], IDBTransaction.READ);
  var store = trans.objectStore('msgs');

  // Get everything in the store;
  var keyRange = IDBKeyRange.lowerBound("");
  var cursorRequest = store.openCursor(keyRange);

  cursorRequest.onsuccess = function(e) {
    var result = e.target.result;
    if(!!result == false){
        return;
    }
    console.log(result.value);
    result.continue();
  };
4

3 に答える 3

24

実際には、objectStoreでdateフィールドにインデックスを付けmsgs、objectStoreでインデックスカーソルを開く必要があります。

var cursorRequest = store.index('date').openCursor(null, 'next'); // or prev 

これにより、ソートされた結果が得られます。これが、インデックスの使用方法です。

于 2012-10-04T07:44:05.243 に答える
10

Joshが提案したより効率的な方法は次のとおりです。

「日付」にインデックスを作成したと仮定します。

// Use the literal "readonly" instead of IDBTransaction.READ, which is deprecated:
var trans = db.transaction(['msgs'], "readonly");
var store = trans.objectStore('msgs');
var index = store.index('date');

// Get everything in the store:
var cursorRequest = index.openCursor();
// It's the same as:
// var cursorRequest = index.openCursor(null, "next");
// Or, if you want a "descendent ordering":
// var cursorRequest = index.openCursor(null, "prev");
// Note that there's no need to define a key range if you want all the objects

var res = new Array();

cursorRequest.onsuccess = function(e) {

    var cursor = e.target.result;
    if (cursor) {
        res.push(cursor.value);
        cursor.continue();
    }
    else {
        //print res etc....
    }
};

カーソルの方向について詳しくは、http ://www.w3.org/TR/IndexedDB/#cursor-conceptをご覧ください。

IDBIndex APIはここにあります:http ://www.w3.org/TR/IndexedDB/#idl-def-IDBIndex

于 2014-07-31T09:14:10.397 に答える
-3

javascript ircのzomg、hughfdjacksonのおかげで、私は最終的な配列をソートしました。以下のように変更されたコード:

var trans = db.transaction(['msgs'], IDBTransaction.READ);
var store = trans.objectStore('msgs');

// Get everything in the store;
var keyRange = IDBKeyRange.lowerBound("");
var cursorRequest = store.openCursor(keyRange);

var res = new Array();

cursorRequest.onsuccess = function(e) {
    var result = e.target.result;
    if(!!result == false){
        **res.sort(function(a,b){return Number(a.date) - Number(b.date);});**
        //print res etc....
        return;
    }
    res.push(result.value);
    result.continue();
};
于 2012-07-15T13:22:27.987 に答える