0

我在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

4 回答 4

4

您可以使用$.grep()将数组向下过滤以匹配,并返回.length.

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

或者本机方法在 IMO 上更好一些,但你需要一个用于旧浏览器的 shim。

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;
于 2012-10-28T17:25:49.857 回答
2

如果它是一个简单的数组对象,为什么不直接遍历它,而不是让它复杂化,为什么$.each在纯 JavaScript 更简单时使用它

 function CheckForExistance(array, name) {
   for(var i=0;i<array.length;i++){
     if(array[i].Name==name) return true;
   }
   return false;
 }
于 2012-10-28T17:28:43.103 回答
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<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/

​</p>

于 2012-10-28T17:33:00.137 回答
-1

这应该有效:

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

value.Name 不是字符串。当通过数组循环时,您会得到一个索引和一个值。

例如: array { 1: "foo", 2:"bar" } 给你 index: 1, value: "foo" index: 2, value: "bar"

value 是您要与变量“名称”进行比较的值。

2:使“存在”为真后,您返回了假。那永远不会“返回真实”。使“存在”为真后,您应该返回存在。

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

于 2012-10-28T17:18:32.280 回答