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

在javascript数组中搜索项目的最佳方法,javascript,jquery,Javascript,Jquery,我有一个javascript对象数组。这些对象包含一些属性,看起来像这样: { "Name" : "blabla", "Id": "1" } function CheckForExistance(array, name){ var exist = false; $.each(array, function(index, value){ if(value.Name == name) {

我有一个javascript对象数组。这些对象包含一些属性,看起来像这样:

  { "Name" : "blabla", "Id": "1" }
     function CheckForExistance(array, name){
       var exist = false;

       $.each(array, function(index, value){
          if(value.Name == name)
          {
             exist = true;
             return false;
          }
       });
       return exist;
     }
现在我有一个函数,它接受一个参数,这个参数将是对象的Name属性值。函数的外观如下所示:

  { "Name" : "blabla", "Id": "1" }
     function CheckForExistance(array, name){
       var exist = false;

       $.each(array, function(index, value){
          if(value.Name == name)
          {
             exist = true;
             return false;
          }
       });
       return exist;
     }
我想知道是否有更好的方法可以做到这一点?

这应该可以:

function CheckForExistance(array, name){
           var exist = false;
           $.each(array, function(index, value){
              if (value == name) {
                   exist = true;
              }
           });
           return exist;
         }
值。名称不是字符串。 在数组中循环时,会得到一个索引和一个值

例如: 数组{1:“foo”,2:“bar”}给出 索引:1,值:“foo” 索引:2,值:“bar”

值是要与变量“name”进行比较的值

2: 将“exist”设置为true后,返回false。这永远不会给出“返回真值”。将“exist”设置为true后,应返回exist

我想我的代码正是您想要的。

这应该可以:

function CheckForExistance(array, name){
           var exist = false;
           $.each(array, function(index, value){
              if (value == name) {
                   exist = true;
              }
           });
           return exist;
         }
值。名称不是字符串。 在数组中循环时,会得到一个索引和一个值

例如: 数组{1:“foo”,2:“bar”}给出 索引:1,值:“foo” 索引:2,值:“bar”

值是要与变量“name”进行比较的值

2: 将“exist”设置为true后,返回false。这永远不会给出“返回真值”。将“exist”设置为true后,应返回exist

我想我的代码就是您要找的。

您可以使用
$.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
,并将在给出truthy返回值后立即退出,然后返回
true
。如果没有找到truthy返回,那么它将返回
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()
,而不需要
checkforexistence
函数

var found = myArray.some(havePropValue("Name", "blabla"));
或者使用
$.grep

var found = $.grep(myArray, havePropValue("Name", "blabla")).length > 0;
您可以使用
$.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
,并将在给出truthy返回值后立即退出,然后返回
true
。如果没有找到truthy返回,那么它将返回
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()
,而不需要
checkforexistence
函数

var found = myArray.some(havePropValue("Name", "blabla"));
或者使用
$.grep

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

如果它是一个简单的数组对象,为什么不直接遍历它,而不是使它复杂化,为什么要使用
$。当普通JavaScript更简单时,每个

 function CheckForExistance(array, name) {
   for(var i=0;i<array.length;i++){
     if(array[i].Name==name) return true;
   }
   return false;
 }
函数checkForExistence(数组、名称){

对于(var i=0;i如果它是一个简单的数组对象,为什么不直接循环遍历它,而不是使它复杂化为什么要使用
$。当普通JavaScript更简单时,每个

 function CheckForExistance(array, name) {
   for(var i=0;i<array.length;i++){
     if(array[i].Name==name) return true;
   }
   return false;
 }
函数checkForExistence(数组、名称){

对于(var i=0;i您还可以使用本机Array.fiter方法来确定名为x的对象是否存在。Filter返回一个新数组,其中包含与回调函数匹配的所有元素(返回true)。

如果新数组的长度大于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"));


这在IE中不起作用。您还可以使用本机Array.fiter方法确定名为x的对象是否存在。筛选器返回一个新数组,其中包含与回调函数匹配的所有元素(返回true)。

如果新数组的长度大于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"));


如果
名称
用作对象的唯一标识符,则应直接将其用作对象内的成员名称,然后直接访问值,而无需搜索。可能他的数组只是他希望通过其函数实现的一个示例。可能的dup副本——请在提出新问题之前使用搜索。您可能会在此处找到答案:如果
名称
用作对象的唯一标识符,则应直接将其用作对象内的成员名称,然后直接访问值,而无需搜索。也许他的数组只是他想要的一个示例为了实现他的功能。可能重复的-,请在您提出新问题之前使用搜索。感谢您的回复,但是如果我发现目标我没有投票,则返回false
是为了打破每个循环,但是您的代码不起作用。它将始终返回false
返回true
$中。每个
都可以llback,将被忽略。是的,现在它应该可以工作,但它几乎与OP的代码完全相同,但效率较低。在
$中使用
返回false
。每个
回调都会中断循环-这是应该做的,这样,如果项匹配得更快,就不会对数组的其余部分进行额外处理。没有实现我想当你在数组中返回false时,整个函数都会返回false。谢谢你提供的信息。这也是我的想法,但是jQuery方法有点奇怪-因为它是一个回调,普通的
return
语句并不总是意味着你想要的(这是一个完美的例子)。但是在普通的Ja中