代码之家  ›  专栏  ›  技术社区  ›  shareyourpeace

如何使用函数确定Javascript数组中是否存在值?

  •  1
  • shareyourpeace  · 技术社区  · 11 年前

    我将使用一个输入字段,用户可以在其中键入值。
    我创建了他们将键入的变量:“Ben”。
    我希望函数循环遍历nameArray并返回true或false。

    脚本不起作用,我知道它很简单。

    function validateNames() {
        var name = "Ben";
        var nameArray = ["Bill", "Barry", "Zack", "Will"];
        var arrayLength = nameArray.length;
        for (var i = 0; i < arrayLength; i++) {
            //Do something
            if (name != nameArray[i]) {
                alert((nameArray[i]) + "Name is not valid.");
                console.log("Name is not found in array.");
            } else {
                return true;
                console.log(nameArray[i]);
            }
        }
    }
    
    4 回复  |  直到 11 年前
        1
  •  2
  •   JLRishe    11 年前

    循环逻辑知道值不在数组中的唯一方法是首先遍历整个数组。循环将在每次迭代时发出警报,直到找到匹配项。放一个 console.log 在 return 因为前者永远不会执行:

    function validateNames() {
      var name = "Ben";
      var nameArray = ["Bill", "Barry", "Zack", "Will"];
      var arrayLength = nameArray.length;
      for (var i = 0; i < arrayLength; i++) {
        if (name === nameArray[i]) {
          console.log(nameArray[i]);
          return true;
        }
      }
      console.log("Name is not found in array.");
      return false;
    }
    
    validateNames();

    Javascript数组还提供了一种方便的方法来检查它们是否包含某个值。它叫 .indexOf() ,然后返回 -1 当没有匹配项时:

    function validateNames() {
        var name = "Ben";
        var nameArray = ["Bill","Barry","Zack","Will"];
    
        return nameArray.indexOf(name) !== -1;
    }  
    
        2
  •  0
  •   MMM    11 年前

    你可以使用 .indexOf() :

    var nameArray = ["Bill","Barry","Zack","Will"];
    nameArray.indexOf("Bill"); // Returns 0, Bill is found
    nameArray.indexOf("Hillary"); // Returns -1, Hillary not found
    

    因此,您的函数可能看起来像:

    function validateName(name) {
        return nameArray.indexOf(name) !== -1;
    }
    

    请记住,它不适用于IE8或更低版本。

        3
  •  0
  •   krozero    11 年前

    轻松修复:)

    var nameArray = ["Bill", "Barry", "Zack", "Will"];
    
    console.log(validateName("Ben", nameArrray)); // False
    
    console.log(validateName("Will", nameArrray)); // True
    
    function validateName(name, arr){
        var found = 0;
    
        for(var i = 0; i < arr.length; i++){
            found += (name === arr[i])? 1 : 0;
        }
        var result = (found>0)? true: false;
    
        return result;
    }
    
        4
  •  0
  •   Mr. Polywhirl    11 年前

    这将是 false ,因为数组中不存在Ben

    if (nameArray.indexOf(name) > -1)
    

    您可以添加 contains() 方法 Array 类,这样您就不必每次都键入它。

    // Static method
    if (Array.contains === undefined) {
        Array.contains = function(arr, val) {
            return arr.indexOf(val) > -1;
        }
    }
    
    // Instance method
    if (Array.prototype.contains === undefined) {
        Array.prototype.contains = function(val) {
            return this.indexOf(val) > -1;
        }
    }
    
    var nameArray = ["Bill", "Barry", "Zack", "Will"];
    var name = "Ben";
    
    Array.contains(nameArray, name); // false
    nameArray.contains(name);        // false
    

    你也可以用一些 Array.prototype.some .

    if (Array.prototype.contains === undefined) {
        Array.prototype.contains = function(val) {
            return this.some(function(item) {
                return item === name;
            });
        }
    }
    

    更好的方法是polyfill Array.prototype.includes() 这是ECMAScript 7中即将推出的方法。

    Polyfill公司

    if (![].includes) {
      Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {'use strict';
        var O = Object(this);
        var len = parseInt(O.length) || 0;
        if (len === 0) {
          return false;
        }
        var n = parseInt(arguments[1]) || 0;
        var k;
        if (n >= 0) {
          k = n;
        } else {
          k = len + n;
          if (k < 0) {k = 0;}
        }
        var currentElement;
        while (k < len) {
          currentElement = O[k];
          if (searchElement === currentElement ||
             (searchElement !== searchElement && currentElement !== currentElement)) {
            return true;
          }
          k++;
        }
        return false;
      };
    }
    

    用法

    [1, 2, 3].includes(2);     // true
    [1, 2, 3].includes(4);     // false
    [1, 2, 3].includes(3, 3);  // false
    [1, 2, 3].includes(3, -1); // true
    [1, 2, NaN].includes(NaN); // true