我或许有初学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)
失败?
还请解释为什么上述代码无法正常运行
答案 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 wanted,Ian'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);
}