javascript - ceilingEntry和floorEntry

时间:2014-12-08 10:08:08

标签: javascript map sortedmap

我有一个带有双键和对象值的对象,例如:

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键时返回(或者如果双打在单独的数组中则进行二进制搜索)。还有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:0)

  

我能想到的唯一解决方案是迭代双打并在到达celing / floor键时返回(或者如果双打在单独的数组中则进行二进制搜索)。还有更优雅的解决方案吗?

我不这么认为,不。当然,要进行二进制搜索,您必须从Object.keys开始获取属性名称​​的数组,然后对其进行排序,因为当然对象本身是无序的。换句话说,尽管您已使用属性名称按升序编写对象,但JavaScript引擎没有义务通过for-inObject.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>

因此,在进行比较时,你会想要允许这样做。