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

How can I use a Function to determine if a Value exists in a Javascript Array?

我将使用一个输入字段,人们可以在其中输入一个值。
我创建了他们将输入的变量:'Ben'.
我希望函数通过 nameArray 和 return 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]);
        }
    }
}

让循环逻辑知道该值不在数组中的唯一方法是首先遍历整个数组。您的循环将在每次迭代时发出警报,直到找到匹配项。将 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(),当没有匹配时它被称为 returns -1

function validateNames() {
    var name = "Ben";
    var nameArray = ["Bill","Barry","Zack","Will"];

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

您可以使用 .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 或更低版本。

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

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

您可以将 contains() 方法添加到 Array class 中,这样您就不必每次都输入该方法。

// 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 即将推出的方法。

填充

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

轻松修复 :)

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