2012-06-18 61 views
4

我想問一個問題,我對自己在JavaScript中的二維數組,與此類似:使用的indexOf方法找到一個二維數組值

var array = [[2,45],[3,56],[5,67],[8,98],[6,89],[9,89],[5,67]] 

也就是說,在每一個指標,我有一個數組也是如此。

假設我在第二個索引中有一個值,如56,我想要相應的第一個索引(即上例中的3)。

我可以使用循環(如果沒有其他選項),但有沒有更好的方法呢?

另外,我知道在JavaScript indexOf方法,但是當我這樣稱呼它它不返回指數:

array.indexOf(56); 

任何見解將是有益的。

回答

6

你可以這樣做:

var ret; 
var index = array.map(function(el){return el[1];}).indexOf(56); 
if (index !== -1) { 
    ret = array[index][0]; 
} 
+0

'indexOf'不被所有的瀏覽器或者:-) –

+0

@FlorianMargaine是的支持,僅此而已,所以如果op使用'.indexOf',他可以使用'Array.map'。 – xdazz

+0

然而我並沒有真正得到你的解決方案。你只是用內部數組的第二個值返回一個新數組,但OP想要第一個值。例如,他想在這種情況下返回「3」。 –

0

array.indexOf(x)返回x位置陣列中,或-1,如果沒有找到它。在你的二維數組中,這是無用的,因爲56不在數組中;它在一個包含在array中的數組中。您將不得不遍歷第一個數組,然後使用indexOf來檢查每個子數組。

+0

或者,如果您對數據結構具有靈活性,那麼您所模擬的功能就是字典功能,請考慮切換到JavaScript關聯數組:{3:56,2 :45,5:67,...} – nbrooks

1

我發現至少在IE6中(我不確定更新的版本),內置Array類型沒有indexOf方法。如果你在IE中測試,也許這就是你無法入門的原因。我寫了這個小除了在我的所有代碼,包括:

if(!Array.prototype.indexOf){ 
    Array.prototype.indexOf = function(obj){ 
     for(var i=0; i<this.length; i++){ 
      if(this[i]===obj){ 
       return i; 
      } 
     } 
    return -1; 
    }; 
} 

我真的不能採取信用爲這一點。這可能是我在一些教程或Doug Crockford的文章中找到的相當通用的一段代碼。我相當肯定有人會寫出更好的寫作方式。

我發現在Firefox上工作是一個很好的起點,因爲您可以安裝Firebug控制檯並獲得更好的想法,哪裏出問題。我承認這並不能解決跨瀏覽器問題,但至少它可以讓你開始你的項目。

這段小小的代碼將確保您可以使用indexOf方法來查找給定值在一維數組中的位置。使用2維數組,外數組中的每個元素都是一個數組,而不是單個值。我會做一個小測試,看看它是如何工作的,並回到你身邊,除非別人有更好的答案。

我希望這至少能讓你開始。

UPDATE 假設你有一個實現Array.indexOf的瀏覽器,我已經試過每種方法來傳遞你的外部數組中的一個數組元素。

alert(array.indexOf([3,56])) 
alert(array.indexOf("3,56")) 

剛剛返回-1。

奇怪的是,

alert(array.indexOf(array[1])) 

正確返回1。但是你需要知道內部數組的索引才能獲得索引!我看不到一種將數組傳遞給indexOf方法的方法。

+0

我想提這個,我一直在過去的位置,我一直在這裏撕掉我的頭髮+1 –

10

使用一些迭代器函數。

filter允許您遍歷一個數組,並在函數返回true時僅返回值。

現代瀏覽器的方式:

var arr = array.filter(function(el) { 
    return !!~el.indexOf(56); 
}); 
console.log(arr); // [3, 56] 
console.log(arr[ 0 ]); // "3" 

傳統瀏覽器的方式,使用jQuery:

var arr = $.filter(array, function() { 
    return !!~$.inArray(56, $(this)); 
}); 
console.log(arr); // [3, 56] 
console.log(arr[ 0 ]); // "3" 
+0

+1爲你的答案:) – xdazz

+0

對於傳統的瀏覽器,請使用for循環,而不是'$ .filter'爲什麼要使用? – Raynos

+0

@Raynos?性能? –

相關問題