jQuery $ .inArray似乎不适用于关联数组

时间:2012-03-07 10:50:02

标签: javascript jquery

我做了这个小提琴:http://jsfiddle.net/benhowdle89/CANX8/1/

创建一个assoc数组,然后对数组中的值运行测试。达到了错误的结果!

代码概要:

$(document).ready(function(){
    var newArray = [];
    newArray['first'] = 1;
    newArray['second'] = 1;

    $('button').click(function(){
        if($.inArray(1, newArray) != -1){
            $('#dump').css('border', '1px solid red');
        } else {
            $('#dump').css('border', '1px solid blue');
        }
    });
});

3 个答案:

答案 0 :(得分:2)

var newArray = [];
newArray['first'] = 1;
newArray['second'] = 1;

这不会向数组添加任何元素。您可以看到newArray.length将为零。

相反,它会将属性firstsecond添加到newArray

您可以使用

访问它
newArray.first
newArray.second

所以$.inArray无效

答案 1 :(得分:0)

JavaScript数组的索引是无符号的32位整数,因此您无法使用字符串,请参阅http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/

但是,您可以使用以下内容:

function findPropertyWithValue(obj, val) {
    for (var i in obj) {
        if (obj.hasOwnProperty(i) && obj[i] === val) {
            return i;
        }
    }
    return null;
}

var arr = [];
arr['A string'] = '123';
arr['Another string'] = '456';
alert(findPropertyWithValue(arr, "123")); // 'A string'

答案 2 :(得分:0)

inArray适用于基于整数访问的数组。

var len;

    if ( array ) {
        if ( indexOf ) {
            return indexOf.call( array, elem, i );
        }

        len = array.length;
        i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;

        for ( ; i < len; i++ ) {
            // Skip accessing in sparse arrays
            if ( i in array && array[ i ] === elem ) {
                return i;
            }
        }
    }

    return -1;

jQuery就是这样做的。它不使用for(var i in arr)进行迭代...(当然使用hasOwnProperty验证,它将是;))但只能通过索引访问长度。

正如文档所说:http://api.jquery.com/jQuery.inArray/它类似于原生indexOf方法。看看本机indexOf是这样做的,jQuery遵循类似的行为。