大佬教程收集整理的这篇文章主要介绍了Javascript - 如果相同的元素在数组中的不同位置,则 indexOf 不起作用,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用 indexOf()
来获取数组中元素的索引。
fs.read@R_404_6852@(@R_404_6852@name,{ enCoding: 'utf-8' },(error,data) => {
if( error ) return new Error(error);
let SELEcteDWord;
let charMap = [];
let splitteDWord;
let output;
const d = data.split('\n');
for(let i = d.length - 1; i > 0; i--){
const r = Math.floor(Math.random() * (i + 1));
const tmp = d[i];
d[i] = d[r];
d[r] = tmp;
SELEcteDWord = d[r];
}
splitteDWord = SELEcteDWord.split('');
splitteDWord.forEach( (char,i) => {
charMap.push(char);
});
//console.log(charMap);
console.log(`SELEcted word length is ${splitteDWord.length}`);
let dropped = 0;
let mID = Math.floor(splitteDWord.length / 2);
console.log(`Removed letters: ${mID}`);
for (let e = 0; e < splitteDWord.length; e++) {
// probability we should drop this one is
// (desiredDropped - dropped) / (word.length - E)
if( Math.random() < (mID - dropped) / (splitteDWord.length - E) ){
// drop this letter
splitteDWord.splice(e,1,'_');
dropped++;
}
}
//console.log(`Original word: ${SELEcteDWorD}`);
console.log(`Guess the word: ${splitteDWorD}`);
let removedChars = charMap.filter( (char,indeX) => {
if( splitteDWord[index] !== char ){
return char;
}
});
console.log(removedChars);
let charIndex = -1;
rl.prompt();
rl.on('line',(input) => {
//console.log(input);
if( removedChars.includes(input) && charMap.includes(input) ){
charIndex = charMap.indexOf(input,charIndex + 1);
//console.log(charIndeX);
splitteDWord.splice(charIndex,input);
// splitteDWord = splitteDWord.map( (char,i) => {
// charMap[i] === input ? input : char
// });
console.log(`Well done!Gues the next char: ${splitteDWorD}`);
rl.prompt();
} else if( splitteDWord.join() === SELEcteDWord ){
console.log('Congratulation,you have found word!');
rl.close();
process.exit();
} else {
console.log(`Oh noo,wrong letter! Try with a different one!`);
rl.prompt();
}
});
});
我注意到如果在搜索的数组中有两个相同的元素位于不同的索引处,则只会找到一个,而第二个将被忽略。有解决办法吗?
考虑这个 concole 输出,我有单词 grifferesti
,因为字母 i
出现了两次,indexOf
只会给我找到的第一个匹配搜索条件的元素。这成为一个问题,因为一个单词可能包含重复的字符,我需要检查它们是否从用户将显示的单词中删除并尝试猜测
[
'g','r','i','f','e','s','t','i'
]
SELEcted word length is 11
Removed letters: 5
Original word: grifferesti
Guess the word: g,r,_,f,e,_
[ 'i','i' ]
Please insert a letter: i
i
2
Well done!Gues the next char: g,i,_
Please insert a letter: f
f
3
Well done!Gues the next char: g,_
Please insert a letter: t
t
9
Well done!Gues the next char: g,t,_
Please insert a letter: i
i
2
Well done!Gues the next char: g,_
Please insert a letter: s
s
8
Well done!Gues the next char: g,s,_
更新
我正在测试用户 Hacktish 提供的解决方案,但这就是我测试代码时在控制台中发生的情况
SELEcted word length is 9
Your score: 0
Guess the word: _,_
Please insert a letter: a
You found the a letter!
score: 50,Please insert a letter: c
Oh noo!Wrong letter,please retry!
Please insert a letter: b
Oh noo!Wrong letter,please retry!
Please insert a letter: n
You found the n letter!
score: 0,
如您所见,_
字符将不会显示,并且不会添加找到的字母。我不知道这是否可能是一个实施问题
splitteDWord = charMap.map( () => '_' );
rl.prompt();
rl.on('line',(input) => {
if( charMap.includes(input) ){
splitteDWord = splitteDWord.map( (char,i) => {
charMap[i] === input ? input : char;
});
console.log(`You found the ${input} letter!`);
score += 50;
console.log(`score: ${scorE}`);
console.log(`${splitteDWorD}`);
rl.prompt();
} else if( splitteDWord.join('') === SELEcteDWord ){
console.log('Yeah! You found the word!');
rl.close();
} else {
console.log('Oh noo!Wrong letter,please retry!');
score -= 50;
rl.prompt();
}
});
不,这是预期的行为:
indexOf() 方法返回可以在数组中找到给定元素的第一个索引,如果不存在,则返回 -1。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
,您可以在 indexOf
函数中传递第二个参数以查找特定索引之后的元素。
从此处的文档共享:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/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;
}
所以您可以做的只是在 splittedWord
中保留最后添加项目的索引。然后将 that index + 1
传递给 charMap.indexOf
以获得正确的位置。
// 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();
}
,
您需要为该行为编写自己的函数。
indexOf
返回第一个匹配结果,但作为 MD。 Tabish Mahfuz 已经解释过,您可以通过提供第二个参数(起点)来继续搜索以找到下一个匹配元素。
基本上这样的事情应该可以工作:
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
}
然后你可以像这样调用它 [1,2,3,4,5,1].indexesOf(1)
它应该返回 [0,9,10]
。
注意:像这样向 Array
添加函数称为猴子补丁,在生产中您可能不想这样做,因为代码会变得非常混乱。相反,您可以创建包装类或函数。
其他答案向您解释了 indexOf
的行为。但这可能不是您使用的正确功能。您需要许多附加功能才能使用 indexOf
。
如果你使用另一个函数,你可以用更少的代码解决你的问题:
splittedWords = splittedWords.map((_,i)=>charMap[i]===input?input:_);
上面的代码遍历了 splitterWords 数组(@H_138_3@map 函数),_
是数组中的元素,i
是索引。
它用三元运算的结果替换数组中的元素:如果它的原始字符与输入匹配,则由输入替换。否则保持不变。
编辑:
粘贴到 JS 控制台的示例代码
const charR_754_11845@ap=[
'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"]
以上是大佬教程为你收集整理的Javascript - 如果相同的元素在数组中的不同位置,则 indexOf 不起作用全部内容,希望文章能够帮你解决Javascript - 如果相同的元素在数组中的不同位置,则 indexOf 不起作用所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。