如果数组中的相同元素位于不同位置,则Javascript-indexOf不起作用

如果数组中的相同元素位于不同位置,则Javascript-indexOf不起作用,javascript,node.js,arrays,Javascript,Node.js,Arrays,我使用indexOf()获取数组中元素的索引 fs.readFile(文件名,{encoding:'utf-8'},(错误,数据)=>{ if(error)返回新的错误(error); 让我们选择单词; 设charMap=[]; 让分裂的词; 让输出; const d=data.split('\n'); 对于(设i=d.length-1;i>0;i--){ 常数r=数学地板(数学随机()*(i+1)); 常数tmp=d[i]; d[i]=d[r]; d[r]=tmp; selectedWord=

我使用
indexOf()
获取数组中元素的索引

fs.readFile(文件名,{encoding:'utf-8'},(错误,数据)=>{
if(error)返回新的错误(error);
让我们选择单词;
设charMap=[];
让分裂的词;
让输出;
const d=data.split('\n');
对于(设i=d.length-1;i>0;i--){
常数r=数学地板(数学随机()*(i+1));
常数tmp=d[i];
d[i]=d[r];
d[r]=tmp;
selectedWord=d[r];
}
splittedWord=selectedWord.split(“”);
splittedWord.forEach((字符,i)=>{
charMap.push(char);
});
//console.log(charMap);
log(`Selected word length为${splittedWord.length}`);
设为0;
让mid=数学地板(splittedWord.length/2);
log(`Removed letters:${mid}`);
for(设e=0;e{
if(拆分字[索引]!==字符){
返回字符;
}
});
console.log(removedChars);
设charIndex=-1;
rl.prompt();
rl.on('行',(输入)=>{
//控制台日志(输入);
if(删除的字符包括(输入)和&charMap.includes(输入)){
charIndex=charMap.indexOf(输入,charIndex+1);
//console.log(charIndex);
拆分字拼接(charIndex,1,输入);
//splittedWord=splittedWord.map((字符,i)=>{
//charMap[i]==输入?输入:char
// });
log(`Well done!Gues下一个字符:${splittedWord}`);
rl.prompt();
}else if(splittedWord.join()==selectedWord){
log('恭喜,你找到word!');
rl.close();
process.exit();
}否则{
log(`噢,不,错了!换一个字母试试!`);
rl.prompt();
}
});
});
我注意到,如果在搜索的数组中有两个相同的元素位于不同的索引中,则只会找到一个,而忽略第二个。有解决办法吗

考虑这个concole输出,我有单词
grifferesti
,因为字母
I
出现了两次,
indexOf
只会给我找到的第一个匹配搜索条件的元素。这成为一个问题,因为一个单词可能包含重复的字符,我需要检查它们是否从用户将显示的单词中删除并尝试猜测

[
‘g’、‘r’、‘i’、‘f’,
‘f’、‘e’、‘r’、‘e’,
“s”、“t”、“i”
]
所选字长为11
删除的字母:5
原文:grifferesti
猜猜这个词:g,r,u,u,f,e,r,e,u,u_
[‘i’、‘f’、‘s’、‘t’、‘i’]
请插入一封信:i
我
2.
做得好!下一个字符是:g,r,i,u,f,e,r,e,u_
请插入一封信:f
F
3.
做得好!下一个字符是:g,r,i,f,f,e,r,e,u,u_
请插入一个字母:t
T
9
做得好!下一个字符是:g,r,i,f,f,e,r,e,u,t_
请插入一封信:i
我
2.
做得好!下一个字符是:g,r,i,f,f,e,r,e,u,t_
请插入一封信:s
s
8.
做得好!下一个字符是:g,r,i,f,f,e,r,e,s,t_
更新

我正在测试用户Hacktish提供的解决方案,但这是在控制台中测试代码时发生的情况

所选字长为9
你的分数:0
猜猜这个词:_
请插入一封信:a
你找到了一封信!
分数:50
,,,,,,,,
请插入一封信:c
哦,不!错误的字母,请重试!
请插入一封信:b
哦,不!错误的字母,请重试!
请插入一封信:n
你找到那封信了!
分数:0
,,,,,,,,
如您所见,将不显示
\uu
字符,并且不会添加找到的字母。我不知道这是否会成为一个实施问题

splittedWord=charMap.map(()=>“"”);
rl.prompt();
rl.on('行',(输入)=>{
if(字符映射包括(输入)){
splittedWord=splittedWord.map((字符,i)=>{
charMap[i]==输入?输入:char;
});
log(`您找到了${input}字母!`);
分数+=50分;
log(`Score:${Score}`);
log(`${splittedWord}`);
rl.prompt();
}else if(splittedWord.join(“”)==selectedWord){
log('是的!你找到了这个词!');
rl.close();
}否则{
log('ohnoo!错误的字母,请重试!');
得分-=50分;
rl.prompt();
}
});

不,这是一种预期行为:

indexOf()方法返回数组中可以找到给定元素的第一个索引,如果该元素不存在,则返回-1


不,这是一种预期行为:

indexOf()方法返回数组中可以找到给定元素的第一个索引,如果该元素不存在,则返回-1


您可以传入第二个参数
indexOf
函数,以查找特定索引之后的元素

从此处的文档中共享:

const beasts = ['ant', 'bison', 'camel', 'duck', 'bison']; console.log(beasts.indexOf('bison')); // expected output: 1 // start from index 2 console.log(beasts.indexOf('bison', 2)); // expected output: 4 console.log(beasts.indexOf('giraffe')); // expected output: -1
function indexesOf(arr, el) {
    let i = -1, indexes = [];
    while ( (i = arr.indexOf(el, i+1)) != -1 )
        indexes.push(i);
    return indexes;
}
// Outside of your loop
let charIndex = -1;

// Inside the loop
....
....
if ( removedChars.includes(input) && charMap.includes(input) ) {
    charIndex = charMap.indexOf(input, charIndex + 1);
    ....
    ....
if( removedChars.includes(input) && charMap.includes(input) ){
    let charIndex;
    do {
        charIndex = charMap.indexOf(input, charIndex + 1);
    } while( splittedWord[charIndex] != '_' || charIndex != -1 )
    console.log(charIndex);

    if ( charIndex == -1 ) {
        // Not sure if this can happen in your code
        // Shouldn't happen if you are removing 
        // the characters from removedChars array properly
    } else {
        splittedWord.splice(charIndex, 1, input);
        // splittedWord[charIndex] = input; Should also work I think.
    }
    console.log(`Well done! Guess the next char: ${splittedWord}`);
    rl.prompt();
} else {
    console.log(`Oh noo, wrong letter! Try with a different one!`);
    rl.prompt();
}
Array.prototype.indexesOf = function(element) {
  let allIndexes = []
  let index = -1
  //search for all matching elements in array until end of array is reached
  while ((index = this.indexOf(element, index + 1)) >= 0)
    allIndexes.push(index)
  return allIndexes
}
splittedWords = splittedWords.map((_,i)=>charMap[i]===input?input:_);
const charMap=[
  'k','i','w','i'
]
let splittedWords=charMap.map(()=>'_');
const input='i';
splittedWords=splittedWords.map((_,i)=>charMap[i]===input?input:_);
console.log(splittedWords);
// THIS PRINTS: ["_", "i", "_", "i"]