给定一个键,我想在一个对象中找到下一个属性。我不能依赖于键是有序的或顺序的(它们是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()函数,但我相信它会是相同的解决方案。
这似乎是一个很小的问题,但我无论如何也想不出怎么做。
很高兴使用underscore.js或用coffeescript编写的解决方案:)
6条答案
按热度按时间xhv8bpkk1#
es6版本。我只是从storeObject中获取键,查找下一个Index。
字符串
jecbmhm32#
正确答案是:你不能这样做,因为objects are unordered as per ECMAScript's spec。
我建议你使用一个有序的结构,比如数组,来解决这个问题:
字符串
然后
next
函数可以是:型
如果
db
上不存在key
,或者它是最后一个,next
返回undefined
。如果你永远不会要求最后一个项目的下一个,你可以通过删除三元&&
操作符并直接返回db[i + 1].value
来简化该函数。你也可以使用一些Underscore.js实用程序方法来简化
next
:型
(in在这种情况下,
next
有时会返回false
...但它仍然是一个falsy值:))现在,一个更实用的答案可能是,因为大多数浏览器在迭代对象时都会考虑对象的初始化顺序,所以你可以像其他答案建议的那样使用
for in
循环来重复它。我建议使用Object.keys
来简化迭代数组的工作:型
jljoyd4f3#
字符串
4si2a6ki4#
一个直接的解决方案是将数据存储在数组中,并使用对象来简单地存储对象所在数组中的索引。
字符串
基本思想是使用有序结构,在本例中是数组,以顺序的方式保存数据。在本例中,next和prev都是常数时间,add是摊销常数时间,delete是O(N)。
ECMA标准并不保证键的顺序,所以
for/in
不需要按照键被添加的顺序(尽管在实践中,这往往是常见的实现)。在这个解决方案中,我使用一个数组来显式地跟踪插入顺序。编辑:我之前忽略了splice的一个删除问题。对于移除的拼接值之后的所有值,索引都将变得不正确。修复不会影响操作的运行时间复杂度。更快的版本,更少的移除可以让数组变得稀疏,而不是拼接,只需将索引设置为null以释放存储在那里的任何引用。这将使移除操作降低到O(1)。
型
nhaq1z215#
使用undercore.js,你可以获取一个对象的键并完成这个技巧。但我不确定键值对是否以任何方式排序以开始:
字符串
jsFiddle:http://jsfiddle.net/QWhN2/
tsm1rwdh6#
我在2021年登陆这里,所以我会发布ES6解决方案。
一个简单的解决方案,让你导航对象给定一个开始键:
字符串