2009-12-08 90 views
0

我相信这很简单,我曾经有一个检查数组内容的函数。现在我想修改它来检查一个二维数组。javascript - loop multidimestional array

function ChkArray(Str, Val){ 

for (var i=0;i<Str.length;i++){ 
     if (Str[i] == Val) {return i;} 
    } 
return -1; 
} 

我的新尝试:

function ChkArray2(Str, Val){ 

for (var i=0;i<Str.length;i++){ 
     for (var ii=0;ii<Str[ii].length;ii++){ 
      if (Str[i][ii] == Val) {return i;} 
     } 
    } 
return -1; 
} 
+0

我意识到我有另一个问题,我的二维数组的键实际上并不是数字。是否有像PHP一样的'foreach'风格循环? – Mark 2009-12-08 13:51:50

回答

-1

我建议使用JavaScript foreach。

function ChkArray2(Str, Val){  
    for (var i in Str){ 
     for (var ii in Str[i]){ 
      if (Str[i][ii] == Val){ 
       return i; 
      } 
     } 
    } 
    return -1; 
} 
+3

这是一个非常糟糕的主意。你不应该使用'for .. in'来迭代数组,因为它将包含数组的所有属性,它将(至少)包含“length”。 – nickf 2009-12-08 14:00:56

+0

@nickf你说得对,虽然对于这个特定的问题,这是一个可以接受的解决方案。 – Li0liQ 2009-12-08 14:06:00

+1

for ... in Array Array是一个常见的错误。除了属性问题,您也不一定会按数字顺序获取项目。 – bobince 2009-12-08 14:08:36

2

关闭,在你的内循环,要检查当前项目的长度外循环:

function ChkArray2(Str, Val){ 

    for (var i=0;i<Str.length;i++){ 
     for (var ii=0;ii<Str[i].length;ii++){ 
      if (Str[i][ii] == Val) {return i;} 
     } 
    } 
    return -1; 
} 

应工作

+0

谢谢,它确实...除了我意识到我还有一个问题,我的二维数组的键实际上并不是数字。是否有像PHP一样的'foreach'风格循环? – Mark 2009-12-08 13:52:23

+0

是的:for ... in循环。 http://stackoverflow.com/questions/684672/loop-through-json-object – 2009-12-08 13:56:25

+0

是的,它应该只用于对象,而不是数组。 – nickf 2009-12-08 14:06:12

1

如果您问的是更好的方法来解决这个问题,我可能会考虑编写一个函数,它可以处理数组中的任意维数。在你的例子中,返回值是顶层数组的索引,但为了使其通用,你必须将完整的“路径”返回到找到的元素,并让调用代码决定它想要的信息:

function multiFind(arr, val) { // please don't name an array "str"! 
    for (var i = 0, l = arr.length; i < l; ++i) { 
     if (arr[i] === val) { 
      return [i]; 
     } else if (is_array(arr[i])) { 
      var ret = multiFind(arr[i], val); 
      if (ret !== false) { 
       ret.unshift(i); 
       return ret; 
      } 

     } 
    } 
    return false; 
} 

// this function by Doug Crockford 
var is_array = function (value) { 
    return value && 
     typeof value === 'object' && 
     typeof value.length === 'number' && 
     typeof value.splice === 'function' && 
     !(value.propertyIsEnumerable('length')); 
}; 

var inp = ["a","b",["c", ["d", "e", ["f", "g"], "h"]]]; 

multiFind(inp, "a"); // [0] 
multiFind(inp, "b"); // [1] 
multiFind(inp, "c"); // [2, 0] 
multiFind(inp, "f"); // [2, 1, 2, 0] 
multiFind(inp, "h"); // [2, 1, 3] 
multiFind(inp, "x"); // false