在javascript数组中搜索项目的最佳方法

时间:2012-10-28 17:10:48

标签: javascript jquery

我在javascript中有一个对象数组。对象包含一些属性,如下所示:

  { "Name" : "blabla", "Id": "1" }

现在我有一个函数接受一个参数,该参数将是对象的Name属性值。该函数看起来像这样:

     function CheckForExistance(array, name){
       var exist = false;

       $.each(array, function(index, value){
          if(value.Name == name)
          {
             exist = true;
             return false;
          }
       });
       return exist;
     }

我想知道是否有更好的方法可以做到这一点?

4 个答案:

答案 0 :(得分:4)

您可以使用$.grep()将数组过滤为匹配项,并返回.length的比较。

 function CheckForExistance(array, name){
     return $.grep(array, function(obj) {
         return obj.Name == name;
     }).length > 0;
 }

或者本机方法是一个更好的IMO,但你需要旧浏览器的垫片。

function CheckForExistance(array, name){
    return array.some(function(obj) {
        return obj.Name == name;
    });
}

这个使用Array.prototype.some,并在给出真值返回值后立即退出,然后返回true。如果没有找到真正的回报,那么它将返回false


FWIW,您可以通过提供动态属性名称使您的功能更加健壮。

function CheckForExistance(array, prop, val){
    return array.some(function(obj) {
        return obj[prop] == val;
    });
}

然后用它来检查任何属性值。

var found = CheckForExistance(myArray, "Name", "blabla");

或者另一种方法是创建一个函数工厂,创建与迭代器一起使用的函数。

function havePropValue(prop, value) {
    return function(obj) {
        return obj[prop] == value;
    };
}

然后我们可以直接使用.some()而无需CheckForExistance函数。

var found = myArray.some(havePropValue("Name", "blabla"));

$.grep

var found = $.grep(myArray, havePropValue("Name", "blabla")).length > 0;

答案 1 :(得分:2)

如果它是一个简单的数组对象,为什么不只是循环它,而不是使它复杂化为什么在简单的JavaScript更简单时使用$.each

 function CheckForExistance(array, name) {
   for(var i=0;i<array.length;i++){
     if(array[i].Name==name) return true;
   }
   return false;
 }

答案 2 :(得分:0)

您还可以使用本机Array.fiter方法来确定名称x的对象是否存在。 Filter返回一个新数组,其中包含与回调函数匹配的所有元素(返回true)。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter

如果新数组的长度大于0,则至少有一个匹配元素。

function checkForExistance(arrayOfItems, name) {
    return arrayOfItems.filter(function (item) {
        return item.Name === name;
    }).length > 0;

}


var arr = [{
    "Name": "blabla",
    "Id": "1"
}, {
    "Name": "foo",
    "Id": "2"
}]

console.log(checkForExistance(arr, "foo"));

http://jsfiddle.net/Uawrb/1/

这在IE&lt; 9中不起作用,但如果你想让它在那里工作,你可以查看jQuery的$ .grep实现,它应该可以跨浏览器工作:)

function checkForExistance(arrayOfItems, name) {
    return $.grep(arrayOfItems, function (item) {
        return item.Name === name;
    }).length > 0;

}


var arr = [{
    "Name": "blabla",
    "Id": "1"
}, {
    "Name": "foo",
    "Id": "2"
}]

console.log(checkForExistance(arr, "foo"));​

http://jsfiddle.net/5vqqq/1/

答案 3 :(得分:-1)

这应该有效:

function CheckForExistance(array, name){
           var exist = false;
           $.each(array, function(index, value){
              if (value == name) {
                   exist = true;
              }
           });
           return exist;
         }

value.Name不是字符串。 通过数组循环时,您将获得索引和值。

例如: 数组{1:“foo”,2:“bar”}给你 index:1,值:“foo” index:2,value:“bar”

值是您要与变量'name'进行比较的值。

2: 在“存在”为真之后,您返回了false。这永远不会给'回归真实'。在“存在”之后,你应该回归存在。

我认为我的代码就是你要找的。