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

时间:2016-07-14 22:36:05

标签: javascript arrays json

我试图描述一个口袋妖怪动作"数据库"用javascript来练习数据描述。

我有一堆移动,由id(数字)。,name(字符串)和type(字符串)标识。

我想创建一个javascript数组,例如this(使用数组索引作为id,用于按ID进行O(1)查找):

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

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

我想要做的是这样,但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

2 个答案:

答案 0 :(得分:1)

JavaScript中的数组保留了顺序。您的第一个解决方案是最简单,最优雅,应该完美。

另请注意,对象不保证其名称/值对的顺序。

你可能会做类似的事情:

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

但我不认为这是值得的

答案 1 :(得分:1)

还有更多的缺点:

  • 如果你的移动ID是由它们的数组索引隐式给出的(并且你想让你的数组保持一个普通的线性存储阵列),那么就不允许你拥有“漏洞”。在ID范围内,不浪费空间。
  • 如果删除移动,则必须将数组(假设线性存储阵列)不再用于O(1)并移动所有后续ID。
  • 如果您允许ID范围内的空白,例如通过插入moves[3] = ...; moves[5] = ...;或删除数组条目,您的阵列可能会被降级',即不再是线性存储阵列而是地图。

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