0

我可能有初学者 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");

我期望的是:当我再次为“UK”调用该函数时,它显示我“已经存在”;但这并没有发生。我不想玩“原型”或定义我自己的。我只需要一个解决方案。

我的代码中有一个用例,我必须在数组中插入一个新值,并且在接下来的循环中我必须检查该值;但我最终插入了一个现有值......

为什么我最终要插入现有值以及为什么此检查(arr[i] != input)失败?

还请解释一下,为什么上面的代码不能按预期工作

4

5 回答 5

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或其他名称。

于 2013-04-22T16:17:17.693 回答
2

尝试:

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

演示:http: //jsfiddle.net/L9NhU/

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

于 2013-04-22T16:17:07.630 回答
1

一方面,它绝不是一个闭包

无论如何,这是你想要的单线,对伊恩的回答的修改

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

我们使用了一些东西:

  • Array.indexOf在数组中搜索您传递的第一个匹配项,如果存在则返回从零开始的值,-1如果不存在则返回。
  • !~这里是一个特例,我们测试-1. 值~x等于-(x+1),这使得-1a 0(假)和所有其他非零(真)。添加!到混合中会-1产生真实的价值,而其他价值则是虚假的。
  • &&评估它的双方。如果左边是“真实的”,则评估右边,否则不评估。它也被称为“守卫操作员”
于 2013-04-22T16:31:57.700 回答
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);
}
于 2013-04-22T16:24:54.273 回答
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");
于 2013-04-22T16:22:14.320 回答