2012-06-18 31 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?性能? –

相关问题