2015-01-07 1 views
1

Это ниже должно предупредить «true», но оно предупреждает «No item». Где я ошибся в этом коде. Любая подсказка?Вызов метода не работает в javascript

Array.prototype.CheckColor = function (datain) { 
    for (var i = 0, len = this.length; i < len; i++) { 
     if (this[i] === datain) { 
      return true; 
     } else { 
      return "No item"; 
     } 
    } 
} 

var newstr = "red blue green".split(" "); 
var oyrsval = Array.prototype.CheckColor.call(newstr, "blue"); 
alert(oyrsval); 
+4

потому что это возвращает «Нет элемента», если первый элемент не равен datain. – Hacketo

+0

Переместите «return» No item »;' за пределами for (after) – devqon

+0

, потому что в первый раз, когда красный не совпадает к синему, он переходит в инструкцию else, где «No Item» возвращается, и он выходит из функции. –

ответ

0

Мы это уже разъяснялось, что ваша проблема в том, что вы вернетесь из цикла слишком рано. Я предлагаю другое решение, может быть проще:

Array.prototype.CheckColor = function (datain) { 
    return this.some(function(el) { 
     return datain === el; 
    }) || 'No item'; 
} 

Array.prototype.some метод полезен в этом случае. Кроме того, поскольку вы расширяете прототип, вам не нужно идти сложным путем с Array.prototype.CheckColor.call(newstr, "blue"), когда вы можете напрямую использовать newstr.CheckColor("blue").

Проверьте демонстрационную версию.

Array.prototype.CheckColor = function (datain) { 
 
    return this.some(function(el) { 
 
     return datain === el; 
 
    }) || 'No item'; 
 
} 
 

 
var found = "red blue green".split(" ").CheckColor("blue"); 
 
var notfound = "red blues green".split(" ").CheckColor("blue"); 
 
alert(found); 
 
alert(notfound);

Наконец, если тестирование, если элемент находится в массиве не единственное, что вам нужно сделать, вы можете использовать уже имеющийся Array.prototype.indexOf метод:

newstr.indexOf("blue") !== -1 
0

Вы возвращаете результат для первого сравнения в вашем for

Изменить свой код:

for (var i = 0, len = this.length; i < len;i++) { 
    if (this[i] === datain) { 
     return true; 
    } 
} 

return "No item"; 
1

Должно быть

Array.prototype.CheckColor = function(datain){ 
    for (var i = 0, len = this.length; i < len;i++){ 
     if (this[i] === datain){ 
      return true; // Return true if found 
     } 
    } 
    return "No item"; // else return 
} 

Или проще с помощью indexOf:

Array.prototype.CheckColor = function(datain){ 
    return this.indexOf(datain) > -1 ? true : "No item"; 
} 
0

Изменить функцию:

Array.prototype.CheckColor = function(datain){ 

    for (var i = 0, len = this.length; i < len;i++){ 

     if (this[i] === datain) { 
      return true; 
     } 
    } 
    // if here, nothing found 
    return "No item"; 
} 
0

Там ничего плохого зацикливание по массиву, но вы также можете регулярное выражение непосредственно на строке:

String.prototype.CheckColor = function(datain) { 
    return RegExp("\\b" + datain + "\\b").test(this); 
} 

В реальном мире, я полагаю, вы хотели бы избежать специальных символов регулярного выражения внутри datain.

+0

зачем переписывать метод indexOf? – Hacketo

+1

Поскольку нам нужны только отдельные слова, это то, что '\ b' примерно. –