Javascript函数验证数组的内容

时间:2015-06-22 06:19:50

标签: javascript arrays

以下是问题:

validItems(items) - 此函数接收将为客户提供的字符串数组。该函数返回一个空字符串,表示数组中的所有项代码都有效;否则该函数返回数组中的第一个无效项代码。必须从提供的商品代码中选择所有商品代码。它们是:IT00,O144,6A1L,4243,O3D5,44SG,CE64,54FS和4422。

这是我到目前为止所做的:



 function validItems(items) {
     
      var error = false;
    
      for (i = 0; i < items.length; i++) {
    
        if (error == false) {
    
          if (items[i] != "IT00" ||
            items[i] != "0144" ||
            items[i] != "6A1L" ||
            items[i] != "4243" ||
            items[i] != "O3D5" ||
            items[i] != "44SG" ||
            items[i] != "CE64" ||
            items[i] != "54FS" ||
            items[i] != "4422") {
    
            error = items[i];
    
          } else {
    
            error = false;
          }
        } else {
          if (error != false) {return error;} else {return "";}
        }
    
      }
    
    }
    
    var items = ["IT00","0144","6A1L"];
    alert(validItems(items));
&#13;
&#13;
&#13;

它一直在返回IT00。我做错了什么?

6 个答案:

答案 0 :(得分:1)

你会注意到的是,没有复杂性。下面的每个函数都有几个参数,并且执行一个简单任务。乍一看,很容易看出每个功能的作用。

// your data
const validItems = [
  "0144", "6A1L", "4243", "O3D5", "44SG", "CE64", "54FS", "4422"
];

// some reusable functions
const all = f => xs => xs.every(f);
const comp = f => g => x => f(g(x));
const neq = y => x => x !== y;
const indexOf = xs => x => xs.indexOf(x);
const elem = xs => comp(neq(-1))(indexOf(xs))

// your helpers
const validateItems = all(elem(validItems));

// test it out
console.log( validateItems(["0144", "6A1L"]) ); // true
console.log( validateItems(["0144", "CAKE"]) ); // false

答案 1 :(得分:0)

根据您的代码输出IT00是正确的。 您正在使用OR选择器,这意味着如果字符串是IT00,那么它不是0144或6A1L。您的意图是排除所有,因此您正在寻找的数值不是IT00而不是0144而不是6A1L等等。

使用AND:

if (items[i] != "IT00" &&
    items[i] != "0144" &&
    items[i] != "6A1L" &&
    items[i] != "4243" &&
    items[i] != "O3D5" &&
    items[i] != "44SG" &&
    items[i] != "CE64" &&
    items[i] != "54FS" &&
    items[i] != "4422") {

当您了解此逻辑的基础时,也尝试重写您的代码。允许值的数组例如更整洁; - )

答案 2 :(得分:0)

您的第一项在if语句中返回true。如果你的第一个项目是“ITOO”,你的第一个匹配是:

items[i] != "0144"

你的代码然后说

error = items[i]; //which is "ITOO"

然后你返回

error 

这是第一项“ITOO”

答案 3 :(得分:0)

您可以使用基于数组的简单测试,例如

var validCodes = ['IT00', 'O144', '6A1L', '4243', 'O3D5', '44SG', 'CE64', '54FS', '4422'];

function validItems(items) {
  for (var i = 0; i < items.length; i++) {
    if (validCodes.indexOf(items[i]) == -1) {
      return items[i];
    }
  }
  return '';
}

var items = ["IT00", "O144", "6A1L"];
alert(validItems(items));

使代码正常工作

function validItems(items) {

  var error = false;

  for (i = 0; i < items.length; i++) {
    console.log(items[i], error)

    if (error == false) {

      //need to use && since otherwise one value cann't satisfy all these conidtions
      if (items[i] != "IT00" && items[i] != "0144" && items[i] != "6A1L" && items[i] != "4243" && items[i] != "O3D5" && items[i] != "44SG" && items[i] != "CE64" && items[i] != "54FS" && items[i] != "4422") {
        //if current item is not matching assign it to the error and break the loop
        error = items[i];
        break;
        //you can really return from here, not need to use the error variable also
      }
    }
  }
  //this should be outside of the loop
  //if there is an errro return the error string
  if (error != false) {
    return error;
  } else {
    return "";
  }
  return '';
}
var items = ["IT00", "0144", "6A1L"];
alert(validItems(items));

答案 4 :(得分:0)

你的条件应该是“==”而不是“!=”。

这意味着 - &gt;如果“给定代码”与“任何已识别的代码”相同,则识别它,否则将其丢弃。

目前您的情况意味着 - &gt;如果“给定代码”与“任何识别的代码”不同,则识别它。这种情况永远是真的

答案 5 :(得分:0)

您的代码中存在一些基本的编码错误。 我修改了您的代码并在评论中提出了改进的空间。

基本上你的if else语句是多余的。如果您只是通过返回错误的东西退出该功能,那么您已经获得了所需的结果。

如果发现不匹配,则无需保持循环。 如果您在发现错误后需要执行其他检查,则可以使用~/.config/fish/config.fish ,然后在break

时执行错误逻辑

&#13;
&#13;
error !== false
&#13;
&#13;
&#13;