gpt4 book ai didi

javascript/json 存储严格索引的数组

转载 作者:行者123 更新时间:2023-11-29 21:21:36 27 4
gpt4 key购买 nike

我正在尝试用 javascript 描述一个 Pokemon move“数据库”来练习数据描述。

我有一堆 Action ,由 id(数字)、名称(字符串)和类型(字符串)标识。

我想创建一个移动的 javascript 数组,例如这个(使用数组索引作为 id 以按 id 进行 O(1) 查找):

const moves = [
{name: 'Astonish', type: 'Ghost'},
{name: 'Constrict', type: 'Normal'},
{name: 'Acid', type: 'Poison'},
{name: 'Ingrain', type: 'Grass'}
];

但是,我想确保这些条目的索引是严格定位的(以避免将条目粘贴到数组的开头,使索引无效,以及使条目更明确,这样你就不会'每次查看列表时都不需要进行线性搜索来查找项目。

我想做的是这个,但是JavaScript语法不支持:

const moves = [
0: {name: 'Astonish', type: 'Ghost'},
1: {name: 'Constrict', type: 'Normal'},
2: {name: 'Acid', type: 'Poison'},
3: {name: 'Ingrain', type: 'Grass'}
];

通过显式插入每个项目来执行此操作似乎很昂贵且在视觉上很烦人:

const moves = [];

/* anonymous scope: setup moves */
{
moves[0] = {name: 'Astonish', type: 'Ghost'};
moves[1] = {name: 'Constrict', type: 'Normal'},
moves[2] = {name: 'Acid', type: 'Poison'},
moves[3] = {name: 'Ingrain', type: 'Grass'}
}

我可以使用一个对象,但对于这种行为,对象比数组更昂贵。我还可以创建一个对象,然后将其映射到这样的数组中:

const moves = (() => {
let res = [];
let tmp = {
0: {name: 'Astonish', type: 'Ghost'},
1: {name: 'Constrict', type: 'Normal'},
2: {name: 'Acid', type: 'Poison'},
3: {name: 'Ingrain', type: 'Grass'}
};
Object.keys(tmp).map ((key) => {
res[key] = tmp[key];
});

return res;
})();

但这似乎有点傻。

我想要数组索引作为 id 的原因是因为它既可以快速访问,又可以很容易地使另一个对象将移动名称映射回它们的 id(对于 O(1) 按名称移动查找)。

有没有办法以更连贯的方式描述这种数组,或者这些是我在没有发明自己的 javascript 约定、预处理器的情况下唯一的选择吗?

提前致谢。

相关:

Objects vs arrays in Javascript for key/value pairs

最佳答案

缺点比较多:

  • 如果您的移动 ID 由它们的数组索引隐式给出(并且您希望让您的数组保持普通线性存储数组),则不允许在不浪费空间的情况下在 ID 范围内有“漏洞”。
  • 如果删除移动,则必须对不再在 O(1) 中的数组(假设是线性存储数组)进行切片,并移动所有后续 ID。
  • 如果您允许在您的 ID 范围内留空,例如通过插入 moves[3] = ...; moves[5] = ...; 或者通过删除数组条目,您的数组可能会“降级”,即不再是线性存储数组而是映射。

为了避免所有这些问题并且仍然有 O(1) comp。插入、访问和删除的复杂性(除非你的 JS 引擎真的很古怪),使用 map 。 ES6 Map 或普通的旧 Object

关于javascript/json 存储严格索引的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38385304/

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