【问题标题】:Returning true if JavaScript array contains an element如果 JavaScript 数组包含一个元素,则返回 true
【发布时间】:2017-02-06 13:59:57
【问题描述】:

到目前为止,我有这个代码:

var isMatch = viewedUserLikedUsersArray.indexOf(logged_in_user);
    if (isMatch >=0){
      console.log('is match');
    }
    else {
      console.log('no match');
    }

如果一个元素在一个数组中,它将返回一个大于或等于 0 的数字,所以我可以说isMatch >=0,但这似乎不是最安全的方法。我还能如何从所需的代码中返回真/假?

【问题讨论】:

  • 这有什么不安全的?这就是函数的工作原理。
  • 这是.indexOf() 的定义行为 - 返回值-1 表示该值在数组中不是,任何其他值都表示它是。
  • 最安全的方式是什么意思?这会在哪里失败?您可以使用.find.includes
  • 将其包装在一个函数中,并返回一个布尔值而不是记录到控制台。
  • 有一个 ES2015 替代方案 ... Array#includes

标签: javascript arrays boolean indexof


【解决方案1】:

首先我们要明白,viewedUserLikedUsersArray数组中存储的是什么。

如果有原语就可以,但是如果有对象我们就不能使用数组的indexOf方法,因为里面使用了严格比较===,我们怎么知道,和对象的比较是通过链接进行的.

indexOf 的工作方式类似于循环遍历,这是唯一的方法。

如果是对象,我们可以使用数组MDN Array.prototype.find()findIndex Array.prototype.findIndex()find 方法;

我们也可以用 userId 键将用户存储在 hashMap 中,并通过引用对象属性来检查匹配。

var someUsers = {
  '#124152342': {
    ...
  },
  '#534524235': {
    ...
  },
  ...
};

...

var someUserId = '#124152342';

if (someUsers[someUserId]) {
  console.log('is match');
} else {
  console.log('no match');
}

【讨论】:

    【解决方案2】:

    可能会因为某种原因而被抨击,但是嘿,为什么不呢!

    function findMatch(arr, user) {
        var i = 0, count = arr.length, matchFound = false;
    
        for(; i < count; i++) {
            if (arr[i] === user) {
                matchFound = true;
                break;
            }
        }
    
        return matchFound;
    }
    
     var isMatch = findMatch(viewedUserLikedUsersArray, logged_in_user); // etc.
    

    也可以使用includes()

    var isMatch = viewedUserLikedUsersArray.includes(logged_in_user); // returns true/false
    

    【讨论】:

    • 可能是Array.prototype.findMatch = function(token) {...?
    • 这和indexOf()有什么区别?
    【解决方案3】:

    你可以使用Array.prototype.some

    var isMatch = viewedUserLikedUsersArray.some(function(user){
      return user === logged_in_user;
    });
    

    当它找到 true 值时停止

    【讨论】:

      【解决方案4】:

      The One and Only ChemistryBlob 回答 Array.prototype

      Array.prototype.findMatch = function(token) {
          var i = 0, count = this.length, matchFound = false;
      
          for(; i < count; i++) {
              if (this[i] === token) {
                  matchFound = true;
                  break;
              }
          }
      
          return matchFound;
      }
      
      var isMatch = viewedUserLikedUsersArray.findMatch(logged_in_user); // etc.
      

      【讨论】:

        猜你喜欢
        • 2013-07-21
        • 2017-01-29
        • 2021-08-26
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        相关资源
        最近更新 更多