5

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

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

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

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

我可以使用循环来做到这一点(如果没有其他选择),但有没有更好的方法?

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

array.indexOf(56);

任何见解都会有所帮助。

4

4 回答 4

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"
于 2012-06-18T10:24:53.997 回答
6

你可以这样做:

var ret;
var index = array.map(function(el){return el[1];}).indexOf(56);
if (index !== -1) {
  ret = array[index][0];
}
于 2012-06-18T10:14:50.630 回答
1

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

您将不得不遍历第一个数组,然后用于indexOf检查每个子数组。

于 2012-06-18T10:15:00.083 回答
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 方法的方法。

于 2012-06-18T10:21:15.820 回答