【问题标题】:How to add a number into array name如何将数字添加到数组名称中
【发布时间】:2016-03-01 17:14:32
【问题描述】:

我有 5 个数组,每个数组包含 8 个字符串。每个数组都有一个由数字组成的名称,例如“titles1”、“titles2”...我想创建一个 while 循环来检查每个数组中的每个字符串。我目前遇到的问题是我无法更改数组名称中的数字(从 1 到 5 -titles1、2、3 ...)。知道我怎样才能让它工作吗?但是,该代码有效,因为数组名称现在是一个字符串,它不检查数组内的任何内容。

var i = 0; var j = 1; var titles = '';
while(j <= 5) {
    titles = 'titles' + j;
    while(titles1.length >= i) {
        if (searchBookInput === titles[i]) {
            return titles[i] + ' is available';
        }
        i++;
    } j++; i = 0;
}

【问题讨论】:

  • 第二个while循环有错字吗?它似乎在说'title1'。这就是本意吗?

标签: javascript arrays variables while-loop


【解决方案1】:

最好使用多维数组,而不是在名称中添加数字(顺便说一句,这是不可能的):

var i = 0;
var j = 1;
var titles = new Array();

while (j <= 5){ // building your two-dimensional array
    var array = new Array();
    titles[j] = array;
    j++;
}

while(j <= 5) {
    while(titles[j].length <= i) {
        if (searchBookInput === titles[j][i]) {
            return titles[j][i] + ' is available';
        }
        i++;
    }
j++;
i = 0;
}

多维数组解释:http://www.javascripter.net/faq/twodimensional.htm

编辑:我可能犯了语法错误,javascript 对我来说已经有一段时间了。

【讨论】:

  • 哦,所以这是不可能的 :( 感谢您的回答。我需要创建并行数组,这就是为什么我有 5 个这样的数组。然后我会将更多数据打包到一个数组中,谢谢
  • 平行是什么意思?
  • @mad.mix 也不要急于接受答案,因为正确的答案可能会像 Stacky 的答案一样出现
  • 将共享相同索引号的数组,例如 1 个包含书名的数组和另一个包含流派的数组,第一本书将匹配第二个数组中的流派 :)
  • @mad.mix 一个二维数组将是理想的,因为它基本上是一个表的编程等价物:programiz.com/sites/tutorial2program/files/… 我建议研究它,因为它在编程中被大量使用 ^ ^
【解决方案2】:

我认为 eval 可能是你的朋友。 eval 解决方案并不完全理想,因为它污染了全局命名空间(我认为)。因此,另一种解决方案可能是:

var i = 0; var j = 1; var titles = '';
while(j <= 5) {
    titles = eval('titles' + j);
    while(titles.length >= i) {
        if (searchBookInput === titles[i]) {
            return titles[i] + ' is available';
        }
        i++;
    } j++; i = 0;
}

【讨论】:

  • 这是一个可怕的解决方案,绝对不应该是公认的答案。不要使用构造变量名称,绝对不要使用eval 来评估它们。相反,使用数组来保存多个事物并使用索引来访问它们的元素——这就是它们的用途。
  • 你的意思是使用一个对象并使用它迭代?顺便说一句,是否有一些关于解决方案可怕的参考? :) 我看到了这个:nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood 它有点过时了。
  • 感谢所有 -ve 投票。但是没有一个解释可以解释为什么 evals 很讨厌。讨厌是因为它说或讨厌是有原因的?
【解决方案3】:

您可以将五个数组放入一个对象中并像这样遍历它的键,而不是尝试迭代变量名:

var myObj = {
    titles1: ["The", "quick", "fox", "jumps", "over", "the", "lazy", "dog"],
    titles2: ["The", "quick", "fox", "jumps", "over", "the", "lazy", "dog"],
    titles3: ["The", "quick", "fox", "jumps", "over", "the", "lazy", "dog"],
    titles4: ["The", "quick", "fox", "jumps", "over", "the", "lazy", "dog"],
    titles5: ["The", "quick", "fox", "jumps", "over", "the", "lazy", "dog"]
};

for (var key in myObj) {
    var array = myObj[key]; //array will be titles1, titles2, ...
    //do your stuff here...        
}

这是可行的,因为在 JavaScript 中,您可以通过两种方式访问​​对象的值:

object.someValue

object["someValue"]

【讨论】:

  • 是的..这也是可能的。但是,在这个解决方案中,密钥似乎仅限于一些 n ?您可以先将 myObj 分配给标题,然后按照 for 循环中的说明进行迭代。
  • 在这种情况下(for-key-in-loop),限制是对象中的键数。如果您想将其限制为“标题”1 到 5,您可以使用 for 循环并在每次迭代时执行 var array = myObj["titles" + i]
【解决方案4】:

您可以创建一个多维对象,其中每个对象包含一组具有相应标题的书籍,如下所示:

searchBookInput = "The Martian"

books = [{"title" : "The Martian"}, {"title" : "War And Peace"}, {"title" : "The Art of War"}]
comics = [{"title" : "Ms Marvel"}, {"title" : "Saga"}, {"title": "The Walking Dead"}]

books.filter(function(book) {return book.title == searchBookInput})
// Returns the object with the title matching searchBookInput
comics.filter(function(toon) {return toon.title == searchBookInput})
// Returns no object as no comic matches searchBookInput

这可能比需要迭代多维数组更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多