2015-06-22 2 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));

It продолжает возвращать 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 точек, и вы не поместили if в массив – 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

Ваш первый элемент возвращает true в вашем операторе if. Если ваш первый пункт «Itoo», Первый матч вы делаете это:

items[i] != "0144" 

код затем говорит

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

, а затем вы вернетесь

error 

, который является первым item "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, чтобы увидеть его запустить

То, что вы увидите здесь, что есть ZERO СЛОЖНОСТИ. Каждая функция ниже принимает несколько аргументов и делает один простой задачей. Очень легко понять, что делает каждая функция на первый взгляд.

// 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 сладкий!"

Yup! Я полностью согласен

Вот что тот же код выглядит в 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 
Смежные вопросы