我有一个带有双键和对象值的对象,例如:
var animation = {
0.0: position1,
0.1: position2,
0.4: position3,
...
}
我想知道给定值的天花板和地板键。 e.g:
ceilingKey(animation, 0.3) //should return 0.1
floorKey(animation, 0.3) //should return 0.4
我对任何解决方案持开放态度(例如,双打不一定是对象键,它们甚至可以是一个单独的数组)。
我能想到的唯一解决方案是迭代双打并在到达celing / floor键时返回(或者如果双打在单独的数组中则进行二进制搜索)。还有更优雅的解决方案吗?
答案 0 :(得分:0)
我能想到的唯一解决方案是迭代双打并在到达celing / floor键时返回(或者如果双打在单独的数组中则进行二进制搜索)。还有更优雅的解决方案吗?
我不这么认为,不。当然,要进行二进制搜索,您必须从Object.keys
开始获取属性名称的数组,然后对其进行排序,因为当然对象本身是无序的。换句话说,尽管您已使用属性名称按升序编写对象,但JavaScript引擎没有义务通过for-in
或Object.keys
或任何其他迭代按顺序访问这些属性方法。许多JavaScript引擎按照它们添加到对象的顺序访问属性,但这是未定义的行为,您不会依赖它。
附注:你在问题中说了几次“双打”,我相信这些属性名称。请注意,尽管您已将它们编写为数字(完全有效),但属性名称最终为字符串,而不是数字,因为在ES5和早期属性名称中总是字符串(在ES6中我们将有两个字符串和Symbol
objects):
var name = Object.keys({0.1:"foo"})[0];
snippet.log("name = " + name);
snippet.log("type = " + typeof name);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
因此,在进行比较时,你会想要允许这样做。