使用indexOf方法在二维数组中查找值

6

我想问一个关于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);

任何见解都将有所帮助。
5个回答

12

使用一些迭代器函数。

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"

对于旧版浏览器,请使用for循环,而不是$.filter - Raynos
2
!!~ 做什么?(我是 JS 新手,以前从未见过!) - Tom R
1
@Tom 如果 indexOf 返回 0(数组中的第一个元素),它仍将触发 true,因为 ~0 转换为 -1,第一个 !-1 转换为布尔值 false,第二个 !false 值转换为 true。 步骤在此处显示(http://jsbin.com/EziLogA/1/edit?js,console)。 - rsacc

6
您可以这样做:
var ret;
var index = array.map(function(el){return el[1];}).indexOf(56);
if (index !== -1) {
  ret = array[index][0];
}

1
indexOf 也不被所有的浏览器所支持 :-) - Florian Margaine
@FlorianMargaine 的确如此,所以如果操作使用 .indexOf,他只需要使用 Array.map - xdazz
我并不是很理解你的解决方案。你只是返回了一个新数组,其中包含内部数组的第二个值,但 OP 想要的是第一个值。例如,在这种情况下,他想要返回 "3"。 - Florian Margaine
@FlorianMargaine 我错过了那个,还以为他需要索引。 - xdazz
没问题 :-) 不过我更喜欢我的答案 :( - Florian Margaine

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方法在一维数组中查找给定值的位置。对于您的二维数组,外部数组中的每个元素都是一个数组,而不是单个值。我将进行一些测试,看看它的确切工作方式,并回复您,除非有人提供更好的答案。

希望这至少能让你有所启发。

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

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

只需返回-1。

奇怪的是,

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

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


我本来就想提到这个。在过去的职位上,我曾经因为这个问题而抓狂。+1 - Joe Green

1

array.indexOf(x) 返回数组中 x 的位置,如果找不到则返回 -1。在您的二维数组中,这是无用的,因为 56 不在数组中;它在一个包含在 array 中的数组中。

您需要循环遍历第一个数组,然后使用 indexOf 检查每个子数组。


另外,如果您对数据结构有灵活性,那么您模拟的特性就是字典。考虑切换到JavaScript关联数组:{3:56、2:45、5:67,...} - nbrooks

1
请尝试以下代码,它是有效的。

 var array = [[2, 45], [3, 56], [5, 67], [8, 98], [6, 89], [9, 89], [5, 67]];
array.map((x, index) => {
    if (x.includes(56)) {
        console.log(index);
    }
})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接