【问题标题】:javascript - loop multidimesntional arrayjavascript - 循环多维数组
【发布时间】:2009-12-08 13:41:00
【问题描述】:

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

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;
}

【问题讨论】:

  • 我意识到我还有另一个问题,我的二维数组的键实际上不是数字。是否有类似 php 的“foreach”样式循环?

标签: javascript arrays


【解决方案1】:

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

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;
}

应该可以的

【讨论】:

  • 谢谢,确实如此……除了我意识到我还有另一个问题,我的二维数组的键实际上不是数字。是否有类似 php 的“foreach”样式循环?
  • 是的,它应该只用于对象,而不是数组。
  • 如果你使用非整数键,你得到的是一个对象映射而不是一个数组。你可以像使用对象一样使用数组,但这根本不是一个好主意。
【解决方案2】:

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

    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

【讨论】:

    【解决方案3】:

    我建议使用 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;
    }
    

    【讨论】:

    • 这是一个非常糟糕的主意。你永远不应该使用for .. in 来迭代数组,因为它将包含数组的所有属性,这将(至少)包括“长度”。
    • @nickf 你是对的,尽管对于这个特定问题,这是一个可以接受的解决方案。
    • for...in over Array 是一个常见的错误。除了属性问题,您也不一定会按数字顺序获取项目。
    • @bobince 作者指出键不是数字,因此不能有任何“数字”顺序;)。请在减去之前阅读整个故事:)
    猜你喜欢
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    相关资源
    最近更新 更多