【问题标题】:Using indexOf method to find value in a 2D array使用 indexOf 方法在二维数组中查找值
【发布时间】:2012-06-18 10:09:51
【问题描述】:

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

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

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

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

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

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

array.indexOf(56);

任何见解都会有所帮助。

【问题讨论】:

    标签: javascript indexing


    【解决方案1】:

    使用一些迭代器函数。

    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
    • !!~ 是做什么的? (我是 JS 新手,以前从未见过!)
    • @Tom 如果indexOf 返回0(数组中的第一个元素),它仍然会触发true,因为~0 变成-1 第一个@987654333 @ 将-1 转换为布尔值false,第二个!false 值转换为true。显示的步骤here
    【解决方案2】:

    你可以这样做:

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

    【讨论】:

    • indexOf 也不是所有浏览器都支持 :-)
    • @FlorianMargaine 是的,就是这样,所以如果操作使用.indexOf,他就可以使用Array.map
    • 我并没有真正得到你的解决方案。您只是返回一个带有内部数组的第二个值的新数组,但 OP 想要第一个值。例如,在这种情况下,他希望返回“3”。
    • @FlorianMargaine 我错过了,以为他想要索引。
    • 没问题 :-) 不过我更喜欢我的答案 :(
    【解决方案3】:

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

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

    【讨论】:

    • 或者,如果您对数据结构具有灵活性,那么您正在模拟的功能就是字典的功能。考虑切换到 javascript 关联数组:{3:56, 2:45, 5:67,...}
    【解决方案4】:

    我发现至少在 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
    猜你喜欢
    • 2014-09-16
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多