使用indexOf方法在2D数组中查找值

时间:2012-06-18 10:09:51

标签: javascript indexing

我想问一个关于JavaScript中的2D数组的问题,类似于:

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

也就是说,在每个索引上,我也有一个数组。

假设我的第二个索引中有一个值,如56,我想要相应的第一个索引(例如上面的3个索引)。

我可以使用循环(如果没有其他选项),但还有更好的方法吗?

另外,我在JavaScript中知道indexOf方法,但是当我这样调用它时它没有返回索引:

array.indexOf(56);

任何见解都会有所帮助。

4 个答案:

答案 0 :(得分:11)

使用一些迭代器函数。

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"

答案 1 :(得分:6)

你可以这样做:

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

答案 2 :(得分: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方法查找给定值在一维数组中的位置。使用二维数组,外部数组中的每个元素都是一个数组,而不是单个值。我会做一些测试,看看它是如何工作的并回到你身边,除非别人有更好的答案。

我希望这至少可以让你开始。

UPDATE 假设您有一个实现Array.indexOf的浏览器,我已经尝试了每种方法来传递外部数组中的一个数组元素。

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

只返回-1。

奇怪的是,

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

正确返回1.但是你需要知道内部数组的索引来获取索引!我看不到将数组传递给indexOf方法的方法。

答案 3 :(得分:0)

array.indexOf( x )返回数组中x的位置,如果未找到,则返回-1。在你的2D数组中,这是没用的,因为56不在数组中;它位于array中包含的数组中。

您必须遍历第一个数组,然后使用indexOf检查每个子数组。