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()
调用后面。真的,我复制了!我的实验出错,编辑成正确的版本