正确的答案是:你不能这样做,因为对象按照 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]];
};