2015-06-22 83 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 
相關問題