for循环跳过javascript中数组中的一项

for循环跳过javascript中数组中的一项,javascript,arrays,Javascript,Arrays,我正在尝试创建一个函数,如果字符串包含某个其他列表中的字符,则该函数将从数组中删除字符串 代码如下: var possible = ["salutations", "goodbye", "thanks", "welcome"]; var incorrect = ["o"]; console.log(possible); function narrowdown(possible, incorre

我正在尝试创建一个函数,如果字符串包含某个其他列表中的字符,则该函数将从数组中删除字符串

代码如下:

var possible = ["salutations", "goodbye", "thanks", "welcome"];
var incorrect = ["o"];

console.log(possible);

function narrowdown(possible, incorrect)
{
    var templist = possible;
    for (i in possible)
    {   
        console.log(i + " " + possible[i]);
        var array1 = possible[i].split("");
        var common = array1.filter(value => incorrect.includes(value));
        console.log(common)
        if (common.length)
        {
            templist.splice(i, 1);
        }
    }
    possible = templist;
}

narrowdown(possible, incorrect);

console.log(possible);
在这里,我试图删除包括字母o在内的所有单词。我在函数中创建了一个临时数组,因为在for循环完全跳过项之前,我就遇到过这种情况。 代码首先记录列表中项目的索引,然后记录项目本身

然后,它将单词转换为一个数组,并检查它与“不正确”数组之间的重叠。它正确地执行此操作并记录重叠字符。 问题似乎是出于某种原因,它跳过了“再见”项。它甚至不处理它

以下是我得到的输出:

[ 'salutations', 'goodbye', 'thanks', 'welcome' ]
0 salutations
[ 'o' ]
1 thanks
[]
2 welcome
[ 'o' ]
[ 'goodbye', 'thanks' ]

问题在于,当您进行
拼接时,阵列会被重新索引。一种解决方案是反向迭代:

var可能=[“问候”、“再见”、“谢谢”、“欢迎”];
变量不正确=[“o”];
控制台日志(可能);
功能缩小(可能,不正确)
{
var templast=可能;
var i=可能的长度;
而(我--)
{   
console.log(i+“”+可能[i]);
var array1=可能[i]。拆分(“”);
var common=array1.filter(值=>不正确。包括(值));
console.log(通用)
if(公共长度)
{
圣殿骑士。拼接(i,1);
}
}
可能=圣殿骑士;
}
缩小范围(可能,不正确);
控制台日志(可能)首先,
for(在可能的情况下是i)
在数组中循环是一种不好的方式,因为它在循环开始之前检索键,并且从不更新该键列表。另外,如果有人为数组指定了一个属性,比如
mably.foo=17
,那么循环也会执行该操作。您遇到的问题是,当拼接数组时,其他所有元素都向左移动一个,将它们的索引更改为少一个,因此新索引实际上跳过了下一个元素。修复方法是在拼接后使用常规for循环和减量
i

for(设i=0;i
如果您正在寻找一个不太“强制性”的函数版本,您可以利用并制作一个单行函数来实现这一点(出于格式化目的,我在下面的代码段中将其拆分为多行)

const-problem=[“问候”、“再见”、“谢谢”、“欢迎”];
功能缩小(可能,不正确){
可能返回。筛选器((值)=>(
!不正确。某些((排除)=>(值。包括(排除)))
));
}
console.log('[“o”]',JSON.stringify(缩小范围(可能,['o']));
console.log('[“a”]',JSON.stringify(缩小范围(可能,['a']));

log('[“a”,“o”]',JSON.stringify(缩小范围(可能,['a”,“o']))问题来自于行
templast=mable
,这是一个引用赋值,意味着当您执行拼接操作时,您同时在两个阵列上执行该操作

通常,这样操作数据被认为是不好的。无论如何,您应该让
缩小范围
返回一个您重新分配给
可能
的值,而不是对它们进行过滤。如果这样做,还可以利用一些较新的阵列方法:

var可能=[“问候”、“再见”、“谢谢”、“欢迎”];
变量不正确=[“o”];
功能缩小(可能,不正确)
{
返回可能的.filter(item=>!不正确.some(test=>item.includes(test)))
}
可能=缩小范围(可能,不正确);
控制台日志(可能);

使用
。一些
也会在匹配后尽早退出,而不是循环所有不正确的值和整个字符串,略微提高性能。

实际上
.filter()
方法正是此项工作的工具。这是否回答了您的问题?非常感谢。这就是我解决问题的原因。我使用了
,因为我可能
,因为我有点懒,我认为这没什么区别,加上我习惯Python。请寻找重复的。这是一个常见的问题。如果您有
var-error=['o','a'],这是不正确的
,然后,除了
“问候语”
之外,您将获得整个数组,而不是什么都不返回。否定应该在
.some()
调用后面,而不是
.includes()
调用后面。真的,我复制了!我的实验出错,编辑成正确的版本