以下是问题:
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;
它一直在返回IT00。我做错了什么?
答案 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
error !== false
&#13;