2013-04-22 2 views
0

Я пожалуй начинающему Javascript вопрос:Является ли это JavascriptClosure usecase?

var countries = [ 
    "Bangladesh", "Germany", "Pakistan"]; 


function testexistence(arr, input) { 

    for (var i = 0; i < arr.length; i++) { 
     if (arr[i] != input) { 
      alert("not exist"); 
      arr.push(input); 
      break; 
     } else { 
      alert("already exist "); 
     } 
    } 

} 

testexistence(countries, "UK"); 
testexistence(countries, "Pakistan"); 
testexistence(countries, "UK"); 

Что я ожидаю: когда я снова вызвать функцию «Великобритании» он показывает мне «уже существует»; но этого не происходит. Я не хочу играть с «прототипом» или определять свой собственный. Мне просто нужно одно линейное решение.

В моем коде есть прецедент, где мне нужно вставить новое значение в массив, а в следующих циклах я должен проверить это значение; но я заканчиваю вставку существующего значения ...

Почему я заканчиваю вставку существующего значения и почему эта проверка (arr[i] != input) терпит неудачу?

Пожалуйста, объясните, почему этот код не работает, как требуется

+1

Вы должны, вероятно, вводить ввод, а не «Великобритания» каждый раз. Разве это не работает? – bfavaretto

+0

'testexistence' не является хорошим именем для функции. Как насчет 'pushIfUnique' или' pushUnique'? –

ответ

2

Try:

function testexistence(arr, input) { 
    if (!~arr.indexOf(input)) { 
     arr.push(input); 
    } 
} 

DEMO:http://jsfiddle.net/L9NhU/

Обратите внимание, что Array.indexOf не доступен в старых браузерах, так что вы можете использовать polyfill (или сохранить текущий цикл). Вот документы MDN для него, которые включают в себя полипол: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf

+1

Похоже, что его код хочет добавить что-то, чего нет при тестировании. Требуется модификация: D – Joseph

+0

@JosephtheDreamer Crap, вы правы. – Ian

+0

Почему вы использовали ~ для своего «в массиве»? контрольная работа? это более эффективно, чем 'return (arr.indexOf (input)! = -1)'? – andytuba

3

Вам нужно найти весь массив, прежде чем вы сможете решить, что он не существует.

function testexistence(arr, input) { 
    for (var i = 0; i < arr.length; i++) { 
     if (arr[i] === input) { 
      alert("already exists"); 
      return; // halt the search by returning 
     } 
    } 

    // If we're here, we never returned inside the loop, so it wasn't found. 
    arr.push(input); 
    alert("did not exist, now it does"); 
} 

Вместо testexistence, я бы, наверное, назвать свою функцию addUnique или что-то.

+0

Поскольку вы предоставляете решение, вам, вероятно, следует нажать 'input', а не' UK'. – cfs

+0

@cfs: Хех, даже не заметил этого. Просто скопировал и вставил код. Благодаря! –

0

Вы должны попробовать что-то вроде этого

var countries = ["london", "germany", "france"]; 


function testexistence(arr, input) { 
    var isExists = false; 

    for (var i = 0; i < arr.length; i++) { 
     if (arr[i] == input) { 
      isExists = true; 
     }   
    } 

    if(!isExists) 
    { 
     alert("Not Exists"); 
     arr.push(input); 
    } 
    else 
    { 
     alert("Exists"); 
    } 
} 

testexistence(countries, "UK"); 
testexistence(countries, "london"); 
testexistence(countries, "UK"); 
0

Вы можете использовать это вместо того, чтобы ваш:

function testexistence(arr, input) { 

    for (var i = 0; i < arr.length; i++) { 
     if (arr[i] == input) { 
      alert("already exist "); 
      return; 
     } 
    } 

    //if the if part would not work, you pass to here 
    alert("not exist"); 
    arr.push(item); 
} 
1

С одной стороны, это не в коем случае закрытия.

В любом случае, вот the one-liner you wanted, модификация Ian's answer

function testexistence(arr, input) { 
    (!~arr.indexOf(input)) && arr.push(input); 
} 

Мы используем пару вещей:

  • Array.indexOf поиски массива для первого матча, что вы прошли, и возвращает ноль на основе существующего, или -1, если они не существуют.
  • !~ это специальный случай здесь, где мы тестируем -1. Значение ~x равно -(x+1), что составляет -1 a 0 (фальшивый) и все другие отличные от нуля (правдивые). Добавление ! в микс делает -1 правдой и другими фальшивками.
  • && оценивает обе стороны.Если левый «правдивый», то оценивается право, иначе это не так. Он также известен как «охранник»
+1

Вы должны избегать использования '&&' таким образом. Как создатель JavaScript Брендан Эйч указал на свой блог, [это * злоупотребление *] (http://brendaneich.com/2012/04/the-infernal-semicolon/). Лучше всего использовать фактический 'if-statement'. Вы не будете использовать больше символов; просто поверните '&&' в 'if' и поместите его на другую сторону условия. – Sampson

Смежные вопросы