正解は次のとおりです。オブジェクトはECMAScriptの仕様に従って順序付けされていないため、これを行うことはできません。
問題の目的のために、配列のような順序付けられた構造を使用することをお勧めします。
var db = [
{key: 'a', value: 1},
{key: 'b', value: 2},
{key: 'c', value: 3}
];
その場合、next
関数は次のようになります。
var next = function(db, key) {
for (var i = 0; i < db.length; i++) {
if (db[i].key === key) {
return db[i + 1] && db[i + 1].value;
}
}
};
key
に存在しない場合、またはdb
最後の場合は、をnext
返しますundefined
。&&
最後の項目の次を要求する予定がない場合は、三項演算子を削除して直接戻ることにより、その関数を簡略化できますdb[i + 1].value
。
Underscore.jsユーティリティメソッドのいくつかを使用して、次のことをnext
簡単にすることもできます。
var next = function(db, key) {
var i = _.pluck(db, 'key').indexOf(key);
return i !== -1 && db[i + 1] && db[i + 1].value;
};
(この場合、時々next
戻る可能性がfalse
あります...しかしそれはまだ偽の値です:))
for in
さて、より実用的な答えは、ほとんどのブラウザがオブジェクトを反復するときにオブジェクトが初期化された順序を尊重するため、他の答えが示唆するようにループでオブジェクトを反復できるということです。Object.keys
配列を反復処理する作業を簡素化するために使用することをお勧めします。
// Assuming that db is an object as defined in the question.
var next = function(db, key) {
var keys = Object.keys(db)
, i = keys.indexOf(key);
return i !== -1 && keys[i + 1] && db[keys[i + 1]];
};