代码之家  ›  专栏  ›  技术社区  ›  AnonymousSB

比较两个字符串的重复项和字符串位置

  •  0
  • AnonymousSB  · 技术社区  · 7 年前

    我正在编写一个函数,比较两个字母数组,它们的长度总是相同的,以检查两个条件。

    1. array1 包含与相同的值 array2 (一键接一键)
    2. 相同的值在相同的索引位置吗?

    阵列1 多次包含同一个字母,但

    const compareWords = (array1, array2) => {
        let guess = []
    
        array1.forEach((letter, i) => {
            let guessMap = { letter }
    
            // Does the word contain the correct letter
            if (array2.includes(letter)) {
                guessMap.includes = true
    
                // Is the correct letter in the same position?
                if (array1[i] === array2[i]) {
                    guessMap.samePos = true
                } else {
                    guessMap.samePos = false
                }
            } else {
                guessMap.includes = false
                guessMap.samePos = false
            }
            guess.push(guessMap)
        })
        console.log(guess)
    }
    compareWords( ['M', 'O', 'M'], ['M', 'A', 'P'] )

    带电流功能的输入/输出:

    compareWords( ['M', 'O', 'M'], ['M', 'A', 'P'] )
    
    [ { letter: 'M', includes: true, samePos: true },
      { letter: 'O', includes: false, samePos: false },
      { letter: 'M', includes: true, samePos: false } ]
    

    所需输入/输出示例

    compareWords( ['M', 'O', 'M'], ['M', 'A', 'P'] )
    
    [ { letter: 'M', includes: true, samePos: true },
      { letter: 'O', includes: false, samePos: false },
      { letter: 'M', includes: false, samePos: false } ]
    
    compareWords( ['M', 'O', 'M'], ['M', 'A', 'M'] )
    
    [ { letter: 'M', includes: true, samePos: true },
      { letter: 'O', includes: false, samePos: false },
      { letter: 'M', includes: true, samePos: true } ]
    
    compareWords( ['M', 'O', 'M'], ['H', 'M', 'M'] )
    
    [ { letter: 'M', includes: true, samePos: false },
      { letter: 'O', includes: false, samePos: false },
      { letter: 'M', includes: true, samePos: true } ]
    
    6 回复  |  直到 7 年前
        1
  •  0
  •   Gabriel Balsa Cantú    7 年前

    试试这个,这不是一个优雅的方法,但它可能适用于您的预期目的:

    const compareWords = () => {
        const currentGuess = ['M', 'O', 'M', 'E', 'P']
        const currentWord = ['M', 'A', 'P', 'E', 'R']
        let guess = [];
    
        for (let i in currentGuess) {
            const letter = currentGuess[i];
            // Check if this letter was previously stated 
            const previousGuess = guess.find(g => g.letter === letter);
            const guessMap = { letter };
            const currentWordSubset = !!previousGuess ? currentWord.filter((v, i) => i > previousGuess.foundAt) : currentWord;
            if (currentWordSubset.includes(letter)) {
                guessMap.includes = true;
                guessMap.foundAt = currentWord.indexOf(letter);
                if (currentWord[i] === currentGuess[i]) {
                    guessMap.samePos = true
                } else {
                    guessMap.samePos = false
                }
            } else {
                guessMap.includes = false;
                guessMap.samePos = false;
            }
            guess.push(guessMap);
        }
        console.log(`Comparing: ${currentGuess.join('')} vs ${currentWord.join('')}`);
        guess.forEach(g => { 
            if (!!g.foundAt || g.foundAt === 0) { delete g.foundAt}
            return g; 
        })
        console.log(guess);
    }
    
    compareWords();
    

    Comparing: MOMEP vs MAPER
    [ { letter: 'M', includes: true, samePos: true },
      { letter: 'O', includes: false, samePos: false },
      { letter: 'M', includes: false, samePos: false },
      { letter: 'E', includes: true, samePos: true },
      { letter: 'P', includes: true, samePos: false } ]
    
        2
  •  0
  •   Monil Bansal    7 年前

    为了在遍历array1时获得位置,您还必须遍历array2,正如您在代码中所做的那样。

    const currentGuess = ['M', 'O', 'M']
    const currentWord = ['M', 'A', 'P']
    let guess = new Object()
    let ans = []
    
    currentWord.forEach((item, index) => {
        if( quess.hasOwnProperty(item) {
            guess[item]++
        }
        else{
            guess[item] = 1
        }
    })
    
    for(let index = 0; index < currentGuess.length; index++){
        if(guess.hasOwnProperty(currentGuess[index]) and 
        guess[currentGuess[index]]>0 and 
        currentGuess[index]===currentWord[index]){
            guess[currentGuess[index]]--
            console.log("{ letter: '"+currentGuess[index]+"', includes: true, 
            samePos: true },")        
        }
        else if(currentGuess[index]]>0 and 
        currentGuess[index]!=currentWord[index] ){
            console.log("{ letter: '"+currentGuess[index]+"', includes: true, 
            samePos: false},")
        }
        else{
           console.log("{ letter: '"+currentGuess[index]+"', includes: false, 
            samePos: false},")
        }
    
    
    }
    
        3
  •  0
  •   protoproto    7 年前

    可以使用数组映射将其缩短:

    const compareWords = () => {
        const currentGuess = ['M', 'O', 'M'];
        const currentWord = ['M', 'A', 'P'];
        let guess = currentGuess.map((current,index)=>{
          let obj = {};
          obj["letter"] = current;
          obj["includes"] = currentWord.includes(current);
          obj["samePos"] = current === currentWord[index];
          return obj;
        });
        console.log(guess);
    }
    compareWords();
        4
  •  0
  •   Dibyendu Ghosh    7 年前

    你需要再检查一件事。如果array1多次包含同一个字母,则可以在第一次检查时将其推入数组中,然后将在条件中检查它是否存在于数组中。

    const compareWords = () => {
    const currentGuess = ['M', 'O', 'M'];
    const currentWord = ['M', 'A', 'P'];
    let guess = [];
    const exist = [];
    
    currentGuess.forEach((letter, i) => {
        let guessMap = { letter };
    
        // Does the word contain the correct letter and if it is not compared previously
        if (currentWord.includes(letter) && !exist.includes(letter)) {
            guessMap.includes = true;
            exist.push(letter);
    
            // Is the correct letter in the same position?
            if (currentWord[i] === currentGuess[i]) {
                guessMap.samePos = true;
            } else {
                guessMap.samePos = false;
            }
        } else {
            guessMap.includes = false;
            guessMap.samePos = false;
        }
        guess.push(guessMap);
    })
    console.log(guess);
    

    }

        5
  •  0
  •   deerawan    7 年前

    reduce ,例如:

    const compareWords = () => {
      const currentGuess = ['M', 'O', 'M']
      const currentWord = ['M', 'A', 'P']
      
      const result = currentGuess.reduce((result, currentGuessCharacter, currentGuessIndex) => {
        const currentWordIndexFound = currentWord.findIndex(currentWordCharacter => currentWordCharacter === currentGuessCharacter);    
    
        return [
          ...result,
          { 
            letter: currentGuessCharacter, 
            includes: currentWordIndexFound > -1, 
            samePos: currentGuessIndex === currentWordIndexFound 
          }
        ]
      }, []);
    
      console.log(result);
    }
    
    compareWords();
        6
  •  0
  •   AnonymousSB    7 年前

    我使用了@protoproto和@monil bansal的例子来提出以下解决方案。

    const compareWords = (word1, word2) => {
        let wordLetterCount = word2.reduce((result, letter) => {
            result[letter] = (result[letter] || 0) + 1
            return result
        }, {})
    
        const checkIncludes = (letter) => {
            if (word2.includes(letter) && wordLetterCount[letter] > 0) {
                wordLetterCount[letter]--
                return true
            } else {
                return false
            }
        }
    
        const guess = word1.map((letter, i) => {
            return {
                letter,
                includes: checkIncludes(letter),
                samePos: letter === word2[i]
            }
        });
    
        console.log(guess)
    }
    compareWords( ['M', 'O', 'M'], ['M', 'A', 'P'] )
    compareWords( ['M', 'O', 'M'], ['M', 'A', 'M'] )
    compareWords( ['M', 'O', 'M'], ['H', 'M', 'M'] )