这是Javascript Closure的用例吗?

时间:2013-04-22 16:13:04

标签: javascript arrays closures

我或许有初学Javascript问题:

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)失败?

还请解释为什么上述代码无法正常运行

5 个答案:

答案 0 :(得分: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或其他内容。

答案 1 :(得分:2)

尝试:

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

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

请注意,Array.indexOf在旧版浏览器中不可用,因此您可以使用polyfill(或保持当前循环)。这是它的MDN文档,其中包含一个polyfill:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf

答案 2 :(得分:1)

首先,绝不是闭包

无论如何,这里是the one-liner you wantedIan's answer

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

我们使用了几件事:

  • Array.indexOf在数组中搜索您传递的内容的第一个匹配项,如果存在则返回从零开始的值,如果不存在,则返回-1
  • !~是一个特殊情况,我们测试-1。值~x等于-(x+1),这使-1成为0(假),其他所有非零(真实)。将!添加到混合中会使-1变为真值,而其他值则会变得虚假。
  • &&评估其双方。如果左边是“truthy”,则评估右边,否则不评估。它也被称为“守卫运营商”

答案 3 :(得分: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");

答案 4 :(得分: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);
}