如果您問的是更好的方法來解決這個問題,我可能會考慮編寫一個函數,它可以處理數組中的任意維數。在你的例子中,返回值是頂層數組的索引,但爲了使其通用,你必須將完整的「路徑」返回到找到的元素,並讓調用代碼決定它想要的信息:
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