如果您问的是更好的方法来解决这个问题,我可能会考虑编写一个函数,它可以处理数组中的任意维数。在你的例子中,返回值是顶层数组的索引,但为了使其通用,你必须将完整的“路径”返回到找到的元素,并让调用代码决定它想要的信息:
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
我意识到我有另一个问题,我的二维数组的键实际上并不是数字。是否有像PHP一样的'foreach'风格循环? – Mark 2009-12-08 13:51:50