2015-06-22 44 views
0

这里是被要求的内容:JavaScript函数来验证一个数组

validItems(项目) - 这个函数接收它们将成为为客户项目的字符串数组。该函数返回一个空字符串,指示数组中的所有项目代码都是有效的;否则该函数返回数组中的第一个无效项目代码。所有物品代码必须从提供的物料代码中选择。它们是: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));

它不断返回IT00。我究竟做错了什么?

回答

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

+0

...你有209k点,你没有把如果在一个数组 – Tschallacka

+0

@MichaelDibbets看到第一个解决方案....第二个只是对原始代码的修正 –

0

根据您的代码,它正在输出IT00是正确的。 您正在使用或选择器,这意味着如果字符串是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") { 

当你明白这个基本的逻辑,也尝试重写你的代码。例如,允许值的数组有点整齐;-)

+0

如果使用的说法是错误的。有了很长的项目列表,你不想编辑冗长乏味的if语句......使用数组。 – Tschallacka

0

您的第一项在您的if语句中返回true。如果您的第一项是“ITOO”,你所做的第一场比赛是:

items[i] != "0144" 

你的代码,然后说

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

,然后返回

error 

这是第一个项目“ITOO”

0

你或状况应该有 “==” 代替 “!=”。

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

当前您的条件意味着 - >如果“给定的代码”与“任何公认的代码”不相同,则认可它。这种情况将永远是真的

0

你的代码中有一些基本的编码错误。 我已经修改了你的代码,并把它放在我看到有待改进的地方。

基本上你的if else语句是多余的。如果通过返回错误的东西简单地退出函数,您已经获得了期望的结果。

如果我们发现不匹配,则无需保持循环。 在你需要找到一个错误,你将使用break再经过做其他检查的功能做你的逻辑上的错误,如果error !== false

function validItems(items) { 
 
       // create a valid items array. This will make maintaining valid item codes easier. and keep your code readable. 
 
       var valid = ["IT00","0144","6A1L","4243","O3D5","44SG","CE64","54FS","4422"]; 
 
       var error = false; 
 
      
 
       for (i = 0; i < items.length; i++) { 
 
       // Type safe test. Always use 3 === isntead of == your test would have returned true on eveyrthing. 
 
       if (error === false) { 
 
      
 
        if(valid.indexOf(items[i]) === -1) { 
 
        // immedeately escape 
 
        return items[i]; 
 
      
 
        } /*else {// Totally uneccesary 
 
        error = false; 
 
        } 
 
       } else { 
 
        // not needed here. this also escaped your loop after first iteration. 
 
        if (error !== false) {return error;} else {return "";} 
 
       }*/ 
 
       
 
       } 
 
       // we return here because we know the loop is done then. 
 
       return error; 
 
      } 
 
      
 
      var items = ["IT00","0144","6A1L"]; 
 
      alert(validItems(items));

1

我总是喜欢一个功能性方法时接近这样的数据。

我将从ES6开始。您可以将其复制/粘贴到Babel REPL中以查看它运行

这里您会注意到的是有零复杂性。下面的每个函数需要几个参数,并且一个简单的任务。第一眼看到每个功能的功能非常简单。

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

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

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

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

“这是相当fricken甜!”

是!我完全同意

这是同样的代码看起来像在ES5

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

// some reusable functions 
var all = function all(f) { 
    return function (xs) { 
    return xs.every(f); 
    }; 
}; 
var comp = function comp(g) { 
    return function (f) { 
    return function (x) { 
     return g(f(x)); 
    }; 
    }; 
}; 
var neq = function neq(y) { 
    return function (x) { 
    return x !== y; 
    }; 
}; 
var indexOf = function indexOf(xs) { 
    return function (x) { 
    return xs.indexOf(x); 
    }; 
}; 
var elem = function elem(xs) { 
    return comp(neq(-1))(indexOf(xs)); 
}; 

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

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