gpt4 book ai didi

javascript - Javascript中的一组数字对

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:46:09 24 4
gpt4 key购买 nike

ES6 有一个新的 Set 数据结构,用于存储唯一对象集。然而,它基于对象引用而不是值比较。据我所知,这使得在不进行字符串化的情况下不可能拥有一组数字对。

例如,在 Chrome 的控制台中输入(需要 Chrome 38+):

> var s = new Set();
< undefined
> s.add([2, 3]);
< Set {[2, 3]}
> s.has([2, 3])
< false <--- was hoping for 'true'

这似乎是设计使然:因为我将[2, 3]不同 数组传递给has(),它返回false,因为尽管内容相同但它只查看对象引用,并且我分配了一个新的不同数组以传递给 has()。我需要存储对传递给 add() 的原始数组的引用,以便用 has() 进行检查,但这并不总是可行的。例如,如果数字对表示坐标,我可能需要检查集合是否有 [obj.x, obj.y],但这将始终返回 false,因为它分配了一个新数组。

解决方法是对数组进行字符串化,并改为使用“2, 3”之类的字符串作为键。然而,在像游戏引擎这样对性能敏感的东西中,如果每个集合访问都需要进行字符串分配并转换和连接数字字符串,那将是不幸的。

ES6 是否提供了任何功能来解决这个问题而不进行字符串化,或者 ES7 是否有任何即将出现的功能也可以提供帮助?

最佳答案

对于计算密集型任务而言,它并不是完美的最佳选择,但您可以使用使用模板文字的连接字符串,以获得更惯用的方法,同时仍然保持效率,例如

set.add(`${x}_${y}`);

和检索:

set.get(`${i}_${j}`);

(请注意,我有意避免使用 , 作为分隔符,因为它在某些领域(如金融)可能会造成混淆)。

另一件可以做的事情是捕获第一个维度的宽度来展平数组,如果你知道边界,例如

set.get(x+y*width);

或者如果您通常使用较小的数字(不超过 10,000 秒)并且不知道最大宽度是多少,则可以使用任意非常大的数字。这稍微不太理想,但仍然比字符串连接好:

set.get(x+y*Math.floor(Math.sqrt(Number.MAX_SAFE_INTEGER)));

同样,这些都不是完美的解决方案,因为它们不适用于 x*y 可能超过 Number.MAX_SAFE_INTEGER 的非常大的数字,但它们是您的一些东西无需知道固定数组大小的工具箱。

[这里太晚了,但由于 ES7 毕竟还没有解决问题,我注意到如果其他人正在权衡利弊,这并没有被特别提及,有两种方法(第一种明确不能解决,第二种可能)]

关于javascript - Javascript中的一组数字对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25959508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com