【问题标题】:Multidimensional array values jquery多维数组值 jquery
【发布时间】:2014-06-19 22:30:48
【问题描述】:

需要一些关于我正在做的数组上的脚本的帮助

    skill = [
        //[ID, "NAME", TMLEVEL, Learn, Mastery, Prerequisite, PrerequisiteLvl],
        //Schoolgirl, Fighter
        [0, "Steel Punch", 0, 0, null, null],
        [1, "Shockwave", 1, 1, 2, null],
        [2, "Bull's Eye", 10, 2, 2, null],
        [3, "Burning Rave", 20, 2, 2, null],
        [4, "Shockvibe", 20, 1, 2, null],
        [5, "Sense Breaker", 20, 1, 2, null],
        [6, "Luck Breaker", 20, 1, 2, null],
        [7, "Pumping Heart", 25, 3, 3, skill[3], 1],
        [8, "Armor Breaker", 30, 2, 2, skill[1], 10],
        [9, "Upper Smash", 40, 2, 2, skill[2], 10],
        [10, "Hyper Beat", 45, 4, 3, [skill[2],skill[3]], [10,10]],
        [11, "Tornado Bomb", 50, 3, 3, skill[8], 1]
    ];

我需要在数组中的某些点再次调用数组以将数组值放在那里,就像我在这里一样。 从理论上讲,这可以正常工作,没有任何错误,但是当我在其中调用数组时,它说它是“未定义的”。

任何人都知道如何在不重写所有内容的情况下做到这一点? (因为我在 +- 300 行代码中使用它)。

【问题讨论】:

  • 你怎么称呼里面的数组?
  • 你能说明你是如何调用数组的吗?
  • 你不能像这样访问内部数组=>技能[9][5]?将返回 [2, "Bull's Eye", 10, 2, 2, null]
  • 它在里面,看到最后的数字 11 我调用技能 [8] 来获取数组数字 8 到数字 11 的所有值
  • 他在定义数组时试图访问它,它不起作用。

标签: javascript jquery arrays multidimensional-array


【解决方案1】:

经过漫长的过程,我想出了一个解决方案,可以替换所有先决条件,即使它们是几个级别的深度(例如,技能_3 需要技能_2,而技能_1 需要...)。

这将需要正确声明您的 skill 变量(在您的问题中,并非所有技能都有 7 个变量)。

以下是变量的示例:

var skill = [
    //[ID, "NAME", TMLEVEL, Learn, Mastery, Prerequisite, PrerequisiteLvl],
    [0, "Steel Punch",  0,  0,  0,  null,   null],
    [1, "Shockwave",    1,  1,  2,  null,   null],
    [2, "Bull's Eye",   10, 2,  2,  7,      null],
    [3, "Burning Rave", 20, 2,  2,  null,   null],
    [4, "Shockvibe",    20, 1,  2,  null,   null],
    [5, "Sense Breaker",20, 1,  2,  null,   null],
    [6, "Luck Breaker", 20, 1,  2,  null,   null],
    [7, "Pumping Heart",25, 3,  3,  3,      1],
    [8, "Armor Breaker",30, 2,  2,  7,      10],
    [9, "Upper Smash",  40, 2,  2,  2,      10],
    [10,"Hyper Beat",   45, 4,  3,  [2,3],  [10,10]],
    [11,"Tornado Bomb", 50, 3,  3,  8,      1]
];

现在,我想到了一个函数setPrerequisites(),它将针对 1 个技能递归地设置它的先决条件:

Array.prototype.setPrerequisites = function(){
    if (typeof this[5] === "number")
    {
        this[5]=skill[getPosOfSkill(this[5])];
        this[5].setPrerequisites();
    }
    else if (this[5] instanceof Array)
    {
        if (this[5].isSkill()) this[5].setPrerequisites();
        else
        {
            for(var i = 0; i < this[5].length; i++)
            {
                this[5][i] = skill[getPosOfSkill(this[5][i])];
                this[5][i].setPrerequisites();
            }
        }
    }
}

这个函数使用isSkill()来判断一个数组是技能还是技能ID数组:

Array.prototype.isSkill = function(){
    return this.length==7 && typeof this[1]==="string";
}

它还使用getPosOfSkill(id) 来查找正确的技能,以防您的技能未按特定顺序列出,或者如果 ID 缺失:

function getPosOfSkill(id){
    for(var i=0; i<skill.length; i++) if (skill[i][0]==id) return i;
    return false;
}

您所要做的就是声明您的skill 变量,然后填充它:

for (var i = 0; i < skill.length; i++) skill[i].setPrerequisites();

// if you want to see the results
console.log(skill);

Here is a jsFiddle Demo

【讨论】:

    【解决方案2】:

    您必须在此处重新考虑您的整个方法(推荐),或者首先将这些项目设置为 null,然后重新运行声明:

    skill = [
        //[ID, "NAME", TMLEVEL, Learn, Mastery, Prerequisite, PrerequisiteLvl],
        //Schoolgirl, Fighter
        [0, "Steel Punch", 0, 0, null, null],
        [1, "Shockwave", 1, 1, 2, null],
        [2, "Bull's Eye", 10, 2, 2, null],
        [3, "Burning Rave", 20, 2, 2, null],
        [4, "Shockvibe", 20, 1, 2, null],
        [5, "Sense Breaker", 20, 1, 2, null],
        [6, "Luck Breaker", 20, 1, 2, null],
        [7, "Pumping Heart", 25, 3, 3, null, 1],
        [8, "Armor Breaker", 30, 2, 2, null, 10],
        [9, "Upper Smash", 40, 2, 2, null, 10],
        [10, "Hyper Beat", 45, 4, 3, null, null],
        [11, "Tornado Bomb", 50, 3, 3, null, 1]
    ];
    
    skill = [
        //[ID, "NAME", TMLEVEL, Learn, Mastery, Prerequisite, PrerequisiteLvl],
        //Schoolgirl, Fighter
        [0, "Steel Punch", 0, 0, null, null],
        [1, "Shockwave", 1, 1, 2, null],
        [2, "Bull's Eye", 10, 2, 2, null],
        [3, "Burning Rave", 20, 2, 2, null],
        [4, "Shockvibe", 20, 1, 2, null],
        [5, "Sense Breaker", 20, 1, 2, null],
        [6, "Luck Breaker", 20, 1, 2, null],
        [7, "Pumping Heart", 25, 3, 3, skill[3], 1],
        [8, "Armor Breaker", 30, 2, 2, skill[1], 10],
        [9, "Upper Smash", 40, 2, 2, skill[2], 10],
        [10, "Hyper Beat", 45, 4, 3, [skill[2],skill[3]], [10,10]],
        [11, "Tornado Bomb", 50, 3, 3, skill[8], 1]
    ];
    

    这样,您尝试访问的数组元素已经存在,现在您只是覆盖它们。

    【讨论】:

    • 但是我使用 600 行而不是 300 行代码:-/ 在较慢的计算机上它可能会变慢,不是吗?
    • @Nikato 如果你想让它正确,你应该重新考虑你的整个方法。在这里,您正在复制先决条件中的技能,这是不必要的,您应该只使用他们的 ID,这样会更简单,而且会起作用。如果例如技能 #1 是技能 #2 的先决条件,而技能 #2 是技能 #3 的先决条件,则 Dave 在这里给我们的代码将不起作用。所以你真的应该避免这种情况。
    • 那你有什么建议呢?我正在像戴夫说的那样做,但不是 2 次,而是我覆盖了 3 次代码,并且工作正常
    【解决方案3】:

    我想我找到了一个简单的方法,但是如果在之后定义它仍然有问题,但是因为我只调用之前定义的值,现在没有问题。

    但如果有人知道更好的方法,请告诉我。

    这是我仍然只使用数组的做法:

        var skill = [];
        skill[0] = [0, "Steel Punch", 0, 0, null, null];
        skill[1] = [1, "Shockwave", 1, 1, 2, null];
        skill[2] = [2, "Bull's Eye", 10, 2, 2, null];
        skill[3] = [3, "Burning Rave", 20, 2, 2, null];
        skill[4] = [4, "Shockvibe", 20, 1, 2, null];
        skill[5] = [5, "Sense Breaker", 20, 1, 2, null];
        skill[6] = [6, "Luck Breaker", 20, 1, 2, null];
        skill[7] = [7, "Pumping Heart", 25, 3, 3, skill[3], 1];
        skill[8] = [8, "Armor Breaker", 30, 2, 2, skill[1], 10];
        skill[9] = [9, "Upper Smash", 40, 2, 2, skill[2], 10];
        skill[10] = [10, "Hyper Beat", 45, 4, 3, [skill[2],skill[3]], [10,10]];
        skill[11] = [11, "Tornado Bomb", 50, 3, 3, skill[8], 1];
    

    这样我定义它们并且我仍然在使用我想要的数组(一晚的睡眠让我思考得更好:P)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-27
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2014-03-02
      • 2012-03-29
      • 1970-01-01
      相关资源
      最近更新 更多