【问题标题】:Best way to search item in the javascript array在 javascript 数组中搜索项目的最佳方法
【发布时间】:2012-10-28 17:10:48
【问题描述】:

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

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

【问题讨论】:

标签: javascript jquery


【解决方案1】:

您可以使用$.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;

【讨论】:

  • +1 for .some (我不知道)。但值得一提的是,它在 IE
  • @Robin:谢谢 :) 是的,.some() 需要一个用于旧浏览器的 shim。
【解决方案2】:

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

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

【讨论】:

  • 没有简单的 dict 对象——它是一个对象字面量数组
  • @ianpgall OP 有什么废话{ "Name" : "blabla", "Id": "1" } 为什么它不起作用?
  • 请阅读实际问题。 “我在 javascript 中有一组对象。”后面的句子描述了每个对象的结构。 OP 有有效的代码,但他们想知道是否有“更好”的方法来做到这一点。您对如何循环对象的简化并没有改善或帮助 OP 处理他们的对象数组......
  • 你一点都不傻,原来的问题措辞很奇怪。我只是想确保 OP 得到他们需要的答案,所以这就是我解释的原因
【解决方案3】:

您还可以使用本机 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

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/

【讨论】:

    【解决方案4】:

    这应该可行:

    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" } 给你 索引:1,值:“foo” 索引:2,值:“条”

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

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

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

    【讨论】:

    • 感谢您的回复,但return false 用于在我找到对象时打破每个循环
    • 我没有投票,但您的代码不起作用。它总是返回falsereturn true$.each 回调中,将被忽略。
    • 是的,现在它应该可以工作了,但它几乎与 OP 的代码完全相同,但效率较低。在 $.each 回调中使用 return false 会中断循环 - 这是应该执行的操作,以便如果项目更快匹配,则不会对数组的其余部分进行额外处理。
    • 没有意识到这一点。想当你在数组内返回 false 时,整个函数都返回 false。感谢您提供信息。
    • 我也是这么想的,但是 jQuery 方法有点奇怪——因为它是一个回调,普通的 return 语句并不总是意味着你想要的(这是一个完美的例子)。但是在普通的 Javascript for 循环中,如果您使用 return,它将执行您所期望的操作,并退出该函数。
    猜你喜欢
    • 1970-01-01
    • 2012-05-18
    • 2021-03-27
    • 1970-01-01
    • 2016-11-22
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多