jquery.inArray()函数不起作用

时间:2012-09-06 18:15:10

标签: javascript jquery

我有一个数组如下

       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循环。两个阵列都具有相同的键。请让我知道我在哪里做错了。谢谢!

2 个答案:

答案 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',这些字符串不相等。

http://jsfiddle.net/jbabey/kgYSe/

答案 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!");
}