【问题标题】:In Javascript, what is the most compact, elegant and efficent way to bring the last element of an array to the beginning?在 Javascript 中,将数组的最后一个元素置于开头的最紧凑、优雅和有效的方法是什么?
【发布时间】:2015-10-18 13:00:43
【问题描述】:

我正在编写一个贪吃蛇游戏

而蛇的移动逻辑表明,如果我有一个 Javascript 数组

var links = [elem_0, elem_1, ..., elem_n];

代表蛇的链接的元素,那么蛇的移动方式是弹出elem_n,将其位置更改为elem_0加上翻译单元dxdy的位置,然后把它放在数组的开头:

[elem_0, elem_1, ..., elem_n] ---> [elem_n, elem_0, ..., elem_(n-1)]

(过程中elem_n的一些内部属性发生了变化)

有什么方法可以做到这一点不妥协

  • 在操作数量和内存使用方面达到最佳效率
  • 可读
  • 可维护
  • 聪明(可选)
  • 优雅
  • 紧凑

??????

【问题讨论】:

  • links.unshift(links.pop());
  • 您的需求列表是否按重要性排序?
  • 聪明从来都不是我的要求。 “最佳效率”是一个定义不明确的目标。通常需要的是最少的努力来实现满足要求的解决方案。这为解决问题的其他重要领域留下了更多时间。由于您尚未定义足够的内容,因此我们无法针对特定目标进行编码。此外,最大效率通常需要增加与您的许多其他目标相冲突的复杂性,因此必须知道如何在它们之间进行权衡。
  • JavaScript Array rotate()的可能重复

标签: javascript arrays algorithm optimization game-physics


【解决方案1】:

在操作数量和内存使用方面达到最佳效率

您要求进行通常相互抵消的两项优化。例如更快的速度 == 更多的内存。

也就是说,我可能会选择a (doubly) linked list 来存储我的蛇,因为在前面或尾部移除或添加非常便宜,而且对于游戏,更快比更少内存更可取(在合理范围内,但我想知道在你遇到记忆问题之前你的蛇需要多长时间......远远超出了可玩的范围......还有一些)。

当然,我假设您已经测量并发现基于标准数组的方法太慢(似乎不太可能)。

【讨论】:

    【解决方案2】:

    对于 ES3 以后的任何 Javascript 版本:

    links.unshift(links.pop());
    

    【讨论】:

    • 我的意思是未来的版本:6 和 7。
    • 似乎是最简单的解决方案,直到为更复杂的事情提供了一些理由。也是可读、可维护、紧凑和简单的。
    【解决方案3】:

    您可以通过两种方式旋转数组:

    links.unshift(links.pop());   or
    
    links.push(links.shift());
    

    第一种方法可以解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      相关资源
      最近更新 更多