JS& jQuery:如果索引是字符串,inArray()和indexOf()不能正常工作?

时间:2010-11-21 18:53:49

标签: javascript jquery arrays indexof

我有一个这样的数组:

var arr = [];
arr['A string'] = '123';
arr['Another string'] = '456';

我试图找到'123'或'456'的索引。

这两种:

var string = $.inArray('123', arr)

var string = arr.indexOf('123')

给我-1。当索引是字符串时,是否可以使它工作?

2 个答案:

答案 0 :(得分:3)

问题是您使用JavaScript数组作为关联数组something that it is not。 JavaScript数组的索引是无符号的32位整数,因此您不能使用* strings **。你可以使用像这样的数组

// I'm guessing that you meant to give numerical and not string values
var arr = [123, 456];

或使用对象

var obj = { 
    'A string' : 123,
    'Another string' : 456
};

请注意,使用对象'A string''Another string'是对象obj的属性,不能像数组中的值一样编入索引。您可以通过多种方式检查对象是否具有属性,其中一种方法是使用hasOwnProperty

if (obj.hasOwnProperty('A string')) {
    // if obj has property 'A string' as a direct property
}

另一个将使用in关键字

if ('A string' in obj) {
    // if obj has a property 'A string' as a property (could be an inherited property too)
}

**除非字符串是Tim指出的32位无符号整数的字符串表示,但我认为可以说很多JavaScript开发人员会说明为了清晰起见使用整数。*

答案 1 :(得分:3)

与所有Array方法和length属性一样,indexOf对象的Array方法仅考虑数组的数字属性。这些属性的名称是无符号整数。要测试是否存在具有特定值的属性,您可以在任何对象(包括数组)上执行类似的操作。无法保证属性名称的枚举顺序,因此如果有多个属性具有特定值,那么您无法确定您将获得哪个属性:

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'

请注意,由于所有属性名称(包括数字名称)都转换为字符串,因此您可以使用字符串分配数组属性:

var arr = [];
arr["1"] = "foo";
arr[3] = "bar"
arr.indexOf("foo"); // 1
arr.indexOf("bar"); // 3