如果数组中的相同元素位于不同位置,则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"]