Javascript 获取对象中的下一个键值对

Javascript 获取对象中的下一个键值对,javascript,json,coffeescript,underscore.js,Javascript,Json,Coffeescript,Underscore.js,给定一个键,我想在对象中找到下一个属性。我不能依赖键的顺序或顺序(它们是UUID)。关于我想要的东西,请参见下面的小例子: var db = { a: 1, b: 2, c: 3 } var next = function(db, key) { // ??? } next(db, 'a'); // I want 2 next(db, 'b'); // I want 3 我还想要一个prev()函数,但我确信它将是相同的解决方案 这似乎是一个很小的问题,但我一辈子都不知道

给定一个键,我想在对象中找到下一个属性。我不能依赖键的顺序或顺序(它们是UUID)。关于我想要的东西,请参见下面的小例子:

var db = {
  a: 1,
  b: 2,
  c: 3
}

var next = function(db, key) {
  // ???
}

next(db, 'a');  // I want 2
next(db, 'b');  // I want 3
我还想要一个prev()函数,但我确信它将是相同的解决方案

这似乎是一个很小的问题,但我一辈子都不知道该怎么做


很高兴使用下划线.js或用coffeescript:)编写解决方案。

使用undercore.js,您可以获取对象的键并执行此操作。但我不确定键-值对是否以任何方式开始排序:

var next = function(db, key) {
    var keys = _.keys(db);
    var index = _.indexOf(keys, key);
    if(index+1<keys.length){
         return db[keys[index+1]];
    }else{
        return null;
    }
}
var next=函数(db,键){
var keys=u0.keys(db);
var index=u.indexOf(键,键);

如果(index+1这个问题的直接解决方案是将数据存储在数组中,并使用对象将索引简单地存储在对象所在的数组中

var db = {
    data: [1, 2, 3],
    index: {
        a: 0,
        b: 1,
        c: 2
    }
};
function next(db, key) {
    var next = db.index[key] + 1;
    if (next >= db.data.length) {
        return null;
    }
    return db.data[next];
}
function prev(db, key) {
    var next = db.index[key] - 1;
    if (next < 0) {
        return null;
    }
    return db.data[next];
}
function add(db, key, value) {
    db.index[key] = db.data.push(value) - 1;
}
function remove(db, key) {
    var index = db.index[key], x, temp;
    if (index !== undefined) {
        delete db.index[key];
        db.data.splice(index, 1);
        // Update indices of any elements after the removed element
        for (x in db.index) {
            temp = db.index[x];
            if (temp > index) {
                db.index[x] = temp - 1;
            }
        }
    }
}

正确的答案是:你不能那样做,因为

我建议您使用有序结构(如数组)来解决问题:

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;
    }
  }
};
(在本例中,
next
有时可能返回
false
,但它仍然是一个假值:)


现在,一个更实用的答案可能是,由于大多数浏览器在迭代对象时都会遵循对象初始化的顺序,因此您可以像其他答案所建议的那样,使用
for in
循环来迭代对象。我建议使用来简化迭代数组的工作:

// 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]];
};

ts/es6版本。我只需从storeObject获取键,然后查找下一个索引

 let keys = Object.keys(storeObject);
 let nextIndex = keys.indexOf(theCurrentItem) +1;
 let nextItem = keys[nextIndex];

我在2021年登陆这里,所以我将发布一个Es6解决方案

一个简单的解决方案,允许您在给定起始键的情况下导航对象:

const navObj = (obj, currentKey, direction) => {
    return Object.values(obj)[Object.keys(obj).indexOf(currentKey) + direction];
};

const db = {
  a: 1,
  b: 2,
  c: 3
};

console.log(navObj(db, 'a', 1));
console.log(navObj(db, 'a', 2));
console.log(navObj(db, 'b', -1));


“所以,给定一个“键”,我想在一个对象中查找它的第一个实例。”-你说的“它的第一个实例”是什么意思?你不能有多个同名的属性,所以不可能有第二个实例。“我想返回下一个属性的值。”-你不能依赖对象属性的任何特定顺序(尽管一些-大多数?-浏览器倾向于按创建顺序返回属性)。如果需要对它们进行排序,则需要使用数组。@nnnnnnnn这是有关浏览器属性排序的一个很好的观点,谢谢。我想我可能只需要将此信息拉入一个有序数组,然后遍历它。我认为这不是一个好问题。因为
db
对象键的顺序不一致。此问题的根源是e数据结构--
db
。如果
db
无法更改,则没有答案。即使是一年前的问题,我也不同意@island205。这个问题是我要问的,尽管我有预感它无法完成。被接受的答案也给了我一个解决办法;尽管它使过程有点复杂,但我还是不同意t是一个有效的解决方案。
indexOf
是O(N),并且
.keys
在每次调用时创建每个键的副本(运行时和内存空间中的O(N))是的,我同意。我没有想到。我认为@andbeyond的答案,或者类似的东西可以使用,因为它节省了时间memory@just2n公平地说,这些都是有效的观点。关于性能开销,我认为我们没有太多关于输入大小或这是否是一个性能关键操作的信息。我们不知道多少关于如何使用它,甚至是如何构造输入,我发现很难断言这个解决方案相对于其他解决方案的性能开销是显而易见的。关于Object.keys的顺序,是的,它是未定义的,这就是为什么我在“实用”解决方案中提到它,这不是很正确。[…][…]我很感激你的批评,但我认为你的评论过于消极。没有迹象表明答案完全是基于声誉而被接受的;也许OP认为代码更容易理解/维护,或者他们只是更喜欢将所有内容存储到普通数组中的方法。Object.keys有很好的支持。Cur事实上,唯一不兼容的主要浏览器版本是IE 6-8。答案很好!
// 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]];
};
 let keys = Object.keys(storeObject);
 let nextIndex = keys.indexOf(theCurrentItem) +1;
 let nextItem = keys[nextIndex];
const navObj = (obj, currentKey, direction) => {
    return Object.values(obj)[Object.keys(obj).indexOf(currentKey) + direction];
};

const db = {
  a: 1,
  b: 2,
  c: 3
};

console.log(navObj(db, 'a', 1));
console.log(navObj(db, 'a', 2));
console.log(navObj(db, 'b', -1));