天花板入口和地板入口

ceilingEntry and floorEntry

本文关键字:入口 天花板      更新时间:2023-09-26

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

var animation = {
    0.0: position1,
    0.1: position2,
    0.4: position3,
    ...
}

我想知道给定值的天花板和地板键。 例如:

ceilingKey(animation, 0.3) //should return 0.1
floorKey(animation, 0.3) //should return 0.4

我对任何解决方案都持开放态度(例如,双精度不一定必须是对象键,它们甚至可以是一个单独的数组(。

我能想到的唯一解决方案是遍历双精度并在到达 celing/floor 键时返回(或者如果双精度在单独的数组中,则进行二叉搜索(。还有比这更优雅的解决方案吗?

我能想到的唯一解决方案是遍历双精度并在到达 celing/floor 键时返回(或者如果双精度在单独的数组中,则进行二叉搜索(。还有比这更优雅的解决方案吗?

我不这么认为,不。当然,要进行二叉搜索,您必须从Object.keys开始获取属性名称的数组,然后对其进行排序,因为当然对象本质上是无序的。换句话说,尽管您已经按升序编写了带有属性名称的对象,但 JavaScript 引擎没有义务通过 for-inObject.keys 或任何其他迭代方法按该顺序访问这些属性。许多 JavaScript 引擎按照属性添加到对象的顺序访问属性,但这是您不想依赖的未定义行为


旁注:您在问题中多次说"双倍",我相信指的是属性名称。请注意,尽管您将它们写为数字(这是完全有效的(,但属性名称最终是字符串,而不是数字,因为在 ES5 和更早版本中,属性名称始终是字符串(在 ES6 中,我们将同时拥有字符串Symbol对象(:

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>

因此,在进行比较时,您需要考虑到这一点。