【问题标题】:How can I use a Function to determine if a Value exists in a Javascript Array?如何使用函数来确定 Javascript 数组中是否存在值?
【发布时间】:2015-03-17 16:09:49
【问题描述】:

我将使用一个输入字段来输入一个值。
我创建了他们将输入的变量:'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]);
        }
    }
}

【问题讨论】:

  • 您不能在return 语句之后使用console.log
  • 特定的nameArray[i] 不是输入并不意味着该名称无效,它仍可能位于其他索引之一?

标签: javascript arrays function return-value


【解决方案1】:

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

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

【讨论】:

  • 谢谢。你把事情说清楚了。我没有使用 chrome 开发工具在控制台中获得任何输出。是的,我看过非常简洁的 .indexOf() 。我只是想写出函数()。
  • @shareyourpeace 你真的在调用这个函数吗?如果您单击上面的 Run code sn-p,您应该会在控制台中看到输出。
  • 谢谢。我的菜鸟错误。是的,我忘记在脚本末尾调用 function()。谢谢你一直陪着我。看到代码工作感觉很好。我不能“投票”,因为我需要 15 的声誉。您的回答非常明确,我相信它会对其他人有所帮助。
  • @shareyourpeace 很高兴为您提供帮助。即使您无法投票,您也可以通过单击答案旁边的复选标记来接受每个问题的一个答案。 :)
  • 我点击了绿色!太糟糕了,这个论坛不允许我们以某种方式保持联系。可以搜索某人但不能向他们发送消息。很多人都会做出回应,但不像你那么清楚。再次感谢。
【解决方案2】:

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

【讨论】:

  • 谢谢。以上都是有帮助的。 RLRishe 提供的答案正是我想要的。我想直接开始 - 使用功能和“控制台”输出。我按照 RLRishe 的建议修改了我的代码。我正在使用“chrome 开发工具”,但在控制台中没有得到任何东西。为什么?
【解决方案3】:

轻松解决:)

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】:

这将是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;
        });
    }
}

更好的方法是填充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

【讨论】:

  • 您应该将其分配给 Array 的原型并改用 this
  • 你可能想也可能不想这样做。
  • Array 没有这样的功能。我只是说将其分配给原型以遵循标准设计模式更有意义。
  • @MMM 实际上,Array.prototype.includes() 将被称为contains(),直到浏览器制造商意识到这样命名它会破坏网络。因此,在所有放在 Array 原型上的东西中,contains 在列表中排名很高。
猜你喜欢
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 2013-03-22
相关资源
最近更新 更多