在搜索一个二维数组时,最简洁的方法是什么?

8

The easiest way I could think of is a for loop:

var arr=[["hey","oh"],["scar","tissue"],["other","side"]];
var query="scar";
for(var z=0;z<arr.length;z++){
   if(arr[z].indexOf(query) !== -1){
      //Found
      break;
   }
}

在二维数组中,有没有其他的方法来搜索一个字符串?


你能够按字母顺序排序并运行二分查找吗? - Myles Gray
当然可以!你可以使用while循环或递归!但是你的问题中使用的方法有什么问题吗?我们要处理什么大小的数组? - Michael Robinson
@Myles:o.O 怎么做到的? @Michael:大小并不极端,但那个循环太大了,无法进行简单的搜索...所以我正在考虑简化它... - JCOC611
有另一种方法可以使用jQuery或通过原型化Array对象。 $(arr).each(function(){if(this.indexOf(query)!=-1){/*it is*/}}) - JCOC611
1
作为一名红辣椒乐队的粉丝,点个赞! - Myles Gray
2个回答

11
var arr = [["hey","oh"],["scar","tissue"],["other","side"]];
var flat = [].concat.apply([], arr);
var col = flat.indexOf(query);
var row = -1;
if (col != -1) // found, now need to extract the row
  while (arr[++row].length <= col) // not this row
    col -= arr[row].length; // so adjust and try again

你可以用模运算符替换while语句。 - tomdemuyt
2
@tomdemuyt 对啊,如果该数组被认为是矩形的话那样做是可行的。 - Neil
@DavideVozzi 感谢您发现我的笔误! - Neil

2
你可以这样做:
var arr=[["hey","oh"],["scar","tissue"],["other","side"]];

arr.sort();
arr.join();

要按字母顺序排序,二分查找算法会先查看数组中间的值,然后判断搜索的关键词/数字是大于还是小于该值,从而将数组分成两半,然后再将剩余部分一分为二,直到找到搜索的值;

enter image description here

实现二分查找请阅读此处: http://www.timlin.net/csm/cis111/Chapter10.pdf 幻灯片52-56...
理论上,这种方法可以使您的搜索速度成倍提高。

这对于数字或字符串数组很有效,但不适用于数组的数组。 - Andy E
那么,如果它是一个数组的数组,那不就成了一个三维数组而不是二维了吗? - Myles Gray
1
一个三维数组是一个数组的数组的数组[[[]]],因此它只是一个二维数组。 - JCOC611

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接