我见过很多关于如何在JavaScript中比较两个数组的帖子,如果你找到匹配的话就做点什么。 我想知道如何写相反的东西。 我有两个阵列,当我找不到匹配时我想做点什么。
var a = [1,2,3,5];
var b = [4,7,5,5];
for(i=0;i<a.length;i++){
for(j=0;j<b.length;j++){
if(b[j]===a[i]){
//do something
}
}
}
//somehow return 4, 7
基本上,我想找到与上述相反的方法。如果我找不到比赛,我想表演一个动作。我的其他声明会在哪里?
loop1:
for(var i=0;i<a.length;i++){
loop2:
for(var j=0;j<b.length;j++){
if(b[j]==a[i]){
console.log("break loop");
break loop2;
}
else{
continue loop1;
}
}
}
据我所知,我是否走在正确的轨道上?
答案 0 :(得分:7)
您想要检查数组 a[]
中任何元素的值是否存在于数组 b[]
中,并且您想要“做某事” “条件是”不匹配“。
有许多不同的方法可以考虑“不匹配”的情况。
在你的第一个例子中,每次找到匹配时“做某事”,它会检查 a[]
的每个元素的值,并将该值与<的所有元素进行比较强> b[]
,一个接一个。因此,此比较过程不依赖于匹配的位置。此外,如果 a[]
中的特定元素的值存在于 b[]
中的多个位置,或者<?中的特定元素的值strong> b[]
存在于 a[]
中的多个位置,然后代码将为同一元素的多个匹配中的每个匹配“执行某些操作”。
因此,就您提供的样本数据而言:
var a = [1,2,3,5];
var b = [4,7,5,5];
当 a[]
的“第4个”元素与 b[]
的“第3个”元素匹配时,代码将“执行某些操作”当它发现 a[]
的“第4个”元素与 b[]
的“第4个”元素匹配时,它会再次“做某事” 。我认为这就是你想要它的方式,但如果你只想在中的一个“或多个”位置找到 a[]
中的元素,那么一次性“做某事” b[]
,那么您只需要添加“中断”;声明,紧接着“做某事”声明。
所以,对于你的问题,你说过,你想要“反对”:当你找不到匹配时“做某事”。
从字面上理解,您只需将声明: "if(b[j]===a[i])"
更改为: "if(b[j] != a[i])"
。现在,这可能不你想要什么,因为“不匹配”的情况可能会经常发生:
for(i=0;i<a.length;i++){
for(j=0;j<b.length;j++){
if(b[j] != a[i]){
// do something
}
}
}
另一种可能性是,如果在 a[]
中的任何地方找不到 b[]
元素的值,您想要“做某事” 。为此,您将检查 a[]
的每个元素的值,并将该值逐一与 b[]
的所有元素进行比较,如果在检查 b[]
中所有元素的值后,您找不到与 a[]
的当前元素值匹配的内容, 然后 你会“做点什么”。
在这种情况下,如果您在 a[]
中找到了 b[]
的当前值的匹配项,则进一步检查该元素 a[]
没有必要。您可以跳过剩下的部分,然后开始检查 a[]
的下一个元素到 b[]
的元素。为此,您需要使用 "continue outerloop;"
。
outerloop:
for(i=0;i<a.length;i++){
for(j=0;j<b.length;j++){
if(b[j] === a[i]){
continue outerloop;
}
}
// if we get to here, then no value
// of b[] matched the a[] value, so:
// "do something"
}
第三种可能性是,如果 <{em> a[]
的 任何 元素,您只想“做一些事情”可以在 b[]
的任何位置找到。为此,您将检查 a[]
的每个元素的值,并将该值逐一与 b[]
的所有元素进行比较,如果在检查 b[]
中所有元素的值后,您找不到与 a[]
的当前元素值匹配的内容,你设置一个“标志”并使用 "break outerloop;"
退出所有循环。然后在最后,如果标志是“设置”,你可以“做某事”。
bflag=false;
outerloop:
for(i=0;i<a.length;i++){
for(j=0;j<b.length;j++){
if(b[j] === a[i]){
continue outerloop;
}
}
// if we get to here, then no value
// of b[] matched the a[] value, so,
// set the flag (bflag)
bflag=true;
break outerloop:
}
if(bflag){
// "do something"
}
如果将此代码作为函数调用,则可以简化一下:
outerloop:
for(i=0;i<a.length;i++){
for(j=0;j<b.length;j++){
if(b[j] === a[i]){
continue outerloop;
}
}
// if we get to here, then no value of b[] matched
// the a[] value, so, do-something and return "failed":
// "do something"
return false;
}
// all elements of a[] were matched to
// elements of b[], so: return "success"
return true;
答案 1 :(得分:4)
我不确定你是如何从[5, 7]
和[1, 2, 3, 5]
中获得[4, 7, 5, 5]
的,但你可以使用Array.prototype.some方法比较两个数组:
function compareArrays(a, b) {
return !a.some(function (e, i) {
return e != b[i];
});
}
如果两个数组相同,则返回true
,否则会得到false
。
所以compareArrays([1,2,3], [1,2,3])
会返回true
,而compareArrays([1,2,3, 5], [4,5,7,7])
会返回false
答案 2 :(得分:1)
你的代码中的答案有点接近。请找下面的代码:
var a = [1,2,3,5];
var b = [4,7,5,5];
for(i=0;i<a.length;i++)
{
var bl = false;
for(j=0;j<b.length;j++)
{
if(a[i] == b[j])
{
bl = true;
}
}
if(bl)
alert("find match for : " + a[i]);
}
尝试这个FIDDLE http://jsfiddle.net/Ce7HB/2/
答案 3 :(得分:1)
如果我找不到比赛,我想表演。
最简单的方法是使用辅助函数。幸运的是,such已经存在,用于查找数组中的项目:
for(var i=0;i<a.length;i++)
if (b.indexOf(a[i]) == -1) // not found
// do something
我的其他声明会去哪里?
你不能在这里使用else语句。如果你不想使用辅助函数,你需要使用一个布尔变量来存储循环是否找到匹配,然后测试它。 @Bhavesh的回答有一个例子(虽然它不会提前退出循环)。
但是,有一个更有趣的控制结构:labelled statements。
for(var i=0;i<a.length;i++)
foundNothing: {
for(var j=0;j<b.length;j++)
if(b[j]===a[i])
break foundNothing;
// else we're still here when the block was not "broken"
// do something
}
但是,我们可以通过对某个循环使用continue
语句来更容易地表达。如果我们找到了一个特定的项目,我们只需要转到下一个项目 - 如果我们没有离开,我们就没有找到任何东西。
tofind: for(var i=0;i<a.length;i++) {
for(var j=0;j<b.length;j++)
if(b[j]===a[i])
continue tofind;
// else we're still here
// do something
}
答案 4 :(得分:0)
如果我找不到比赛,我想表演。
最简单的方法是使用辅助函数:
function findEqual(a, b) {
for(var i=0;i<a.length;i++)
for(var j=0;j<b.length;j++)
if(b[j]===a[i])
return true;
return false;
}
if (!findEqual(a, b)) {
// do something
}
我的其他声明会去哪里?
你不能在这里使用else语句。如果你不想使用辅助函数,你需要使用一个布尔变量来存储循环是否找到匹配,然后测试它。 @Bhavesh的回答有一个例子(虽然它不会提前退出循环)。
但是,有一个更有趣的控制结构:labelled statements。
foundNothing: {
for(var i=0;i<a.length;i++)
for(var j=0;j<b.length;j++)
if(b[j]===a[i])
break foundNothing;
// else we're still here when the block was not "broken"
// do something
}