0

我有一个数组如下

       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 循环被调用。两个数组都存在相同的键。请让我知道我在哪里做错了。谢谢!

4

2 回答 2

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

您实际上是在尝试将 object 等同于{ key: 'foo', value: 'bar' }string 'foo',它们不相等。

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

于 2012-09-06T18:20:47.600 回答
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!");
}
于 2012-09-06T18:19:53.193 回答