【问题标题】:javascript - ceilingEntry and floorEntryjavascript - 天花板入口和地板入口
【发布时间】:2014-12-08 10:08:07
【问题描述】:

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

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

【问题讨论】:

    标签: javascript map sortedmap


    【解决方案1】:

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

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


    旁注:您在问题中多次提到“双打”,我相信指的是属性名称。请注意,尽管您将它们写为数字(这是完全有效的),但属性名称最终是 字符串,而不是数字,因为在 ES5 和更早的版本中,属性名称是 always 字符串(在 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>

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2010-09-18
      • 2022-01-11
      相关资源
      最近更新 更多