在JavaScript中,将数组的最后一个元素移到开头最紧凑、优雅和高效的方法是什么?

4

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

enter image description here

蛇的移动逻辑决定了,如果我有一个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的某些内部属性)

如何做到既有效率又节省内存,同时易于阅读、易于维护、聪明(可选)、优雅、紧凑,而不做任何妥协呢?

????


3
links.unshift(links.pop()); - dandavis
你的需求清单按重要性排序了吗? - user663031
3
聪明并非我的要求。 "最优效率" 是一个含糊不清的目标。通常需要的是付出最少的努力来实现符合要求的解决方案。这样可以留更多的时间去解决其他重要的问题。由于你没有定义什么是足够的,我们无法为特定目标编码。此外,最大的效率通常需要增加复杂性,这会与您的许多其他目标产生冲突,因此必须知道如何在它们之间做出权衡。 - jfriend00
可能是JavaScript数组rotate()的重复问题。 - user663031
3个回答

9

操作次数和内存使用方面都能达到最优效率

您正在要求通常相互抵触的两种优化。例如,更快的速度==更多的内存。

话虽如此,我可能会选择(双)链表来存储我的蛇,因为在前端或尾部进行删除或添加非常便宜,并且在游戏中,更快速度比更少内存更可取(在合理范围内,但我想知道您的蛇必须有多长才会遇到内存问题...远远超出可玩范围...和一些其他问题)。

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


3

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

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

links.push(links.shift());

第一种方法解决了你的问题。

2

对于从ES3版本开始的任何Javascript版本:

links.unshift(links.pop());

我的意思是未来的版本:6和7。 - Vidul
似乎是最简单的解决方案,直到提供了更复杂的解决方案的理由。同时也易读、易维护、紧凑和简单。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接