我有一个数组如下
var nameIDHashMap = [];
nameIDHashMap.push({
key: name,
value: xmlLength
});
startToEnd.push({
key: $(this).attr("startFrom"),
value: $(this).attr("endTo")
});
我试图使用inArray()函数,如下所示
var variablestart = startToEnd[0].key;
alert("The variable Start is :"+variablestart);
var toEnd;
if(jQuery.inArray(variablestart,nameIDHashMap) > -1) {
alert('found');
}
if ($.inArray(variablestart, nameIDHashMap) != -1)
{
alert("Found");
// toEnd = startToEnd[connectWindow].value
}
else
alert("Fail");
我不知道为什么总是调用else循环。没有调用if循环。两个阵列都具有相同的键。请让我知道我在哪里做错了。谢谢!
答案 0 :(得分:3)
variablestart
是数组中元素的属性,而不是数组中的元素。
var nameIDHashMap = [];
nameIDHashMap.push({
key: 'foo',
value: 'bar'
});
$.inArray(nameIDHashMap[0].key, nameIDHashMap); // this is not an element, -1
$.inArray(nameIDHashMap[0], nameIDHashMap); // this is an element, 0
您实际上是在尝试将对象{ key: 'foo', value: 'bar' }
等同于字符串'foo'
,这些字符串不相等。
答案 1 :(得分:1)
这不是.inArray()
的工作方式。它搜索的数组元素等于你传入的值。它没有任何比较函数的规定。
即使它确实有效,你在那里组装的也不是“哈希表”。如果要按键进行有效查找,只需在简单对象上创建命名属性:
var map = {};
map.someKey = someValue;
.inArray()
方法和类似的方法在数组中执行线性时间搜索,如果你要获得一个“有趣”数量的键/值,这不是一种非常有效的方法对
编辑 - 如果你真的必须保留一个线性的无索引的命名属性列表,你可以使用这样的查找函数:
function find( list, key, test ) {
test = test || function(e) { return e ? e.key == key : false; };
for (var i = 0; i < list.length; ++i)
if (test(list[i])) return i;
return -1;
}
要使用它,您只需:
if (find(nameIDHashMap, someKey) >= 0) {
alert("Found!");
}