程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Javascript - 如果相同的元素在数组中的不同位置,则 indexOf 不起作用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Javascript - 如果相同的元素在数组中的不同位置,则 indexOf 不起作用?

开发过程中遇到Javascript - 如果相同的元素在数组中的不同位置,则 indexOf 不起作用的问题如何解决?下面主要结合日常开发的经验,给出你关于Javascript - 如果相同的元素在数组中的不同位置,则 indexOf 不起作用的解决方法建议,希望对你解决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,请注明来意。