首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取对象中的下一个键值对

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

Stack Overflow用户
提问于 2012-09-20 11:10:37
回答 5查看 38.4K关注 0票数 25

给定一个键,我想在一个对象中找到下一个属性。我不能依赖键是有序的或连续的(它们是uuid)。我想要什么,请看下面的小例子:

代码语言:javascript
复制
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()函数,但我确信它将是相同的解决方案。

这似乎是一个微不足道的问题,但我无论如何也想不出该怎么做。

很高兴这个解决方案可以使用underscore.js或用coffeescript编写:)

EN

回答 5

Stack Overflow用户

发布于 2017-10-26 06:26:23

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

代码语言:javascript
复制
 let keys = Object.keys(storeObject);
 let nextIndex = keys.indexOf(theCurrentItem) +1;
 let nextItem = keys[nextIndex];
票数 24
EN

Stack Overflow用户

发布于 2012-09-20 11:24:25

代码语言:javascript
复制
function next(db, key){   
  var found = 0; 
  for(var k in db){
    if(found){ return db[k]; }
    if(k == key){ found = 1; }
  }
}
票数 6
EN

Stack Overflow用户

发布于 2012-09-20 11:19:18

一种直接的解决方案是将数据存储在数组中,并使用对象简单地将索引存储在对象所在的数组中。

代码语言:javascript
复制
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;
            }
        }
    }
}

基本思想是使用有序结构,在本例中是数组,以顺序方式保存数据。在这种情况下,next和prev都是常数时间,add是摊销常数时间,delete是O(N)。

键的排序不受ECMA标准的保证,因此for/in不需要按键的添加顺序排序(尽管在实践中,这往往是常见的实现)。在这个解决方案中,我使用一个数组来显式跟踪插入顺序。

编辑:我之前忽略了splice的一个删除问题。对于remove的拼接值之后的所有值,索引将变得不正确。修复不会影响操作的运行时间复杂性。一个删除次数更少的更快的版本可以让数组变得稀疏,而不是拼接,只需将索引设置为null即可释放存储在那里的任何引用。这将把删除操作降低到O(1)。

代码语言:javascript
复制
function remove(db, key) {
    var index = db.index[key];
    if (index !== undefined) {
        delete db.index[key];
        db.data[index] = null;
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12505598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档