我有一个这样的数组:
var arr = [];
arr['A string'] = '123';
arr['Another string'] = '456';
我试图找到“123”或“456”的索引。
两个都:
var string = $.inArray('123', arr)
和
var string = arr.indexOf('123')
给我-1。当索引是字符串时,是否可以让它工作?
我有一个这样的数组:
var arr = [];
arr['A string'] = '123';
arr['Another string'] = '456';
我试图找到“123”或“456”的索引。
两个都:
var string = $.inArray('123', arr)
和
var string = arr.indexOf('123')
给我-1。当索引是字符串时,是否可以让它工作?
与所有 Array 方法和length
属性一样,对象的indexOf
方法Array
仅考虑 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
问题是您使用 JavaScript 数组作为关联数组,而不是. 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 开发人员会说为了清楚起见坚持使用整数。*