JavaScript检查字符串中是否至少有三个字符与另一个变量中的字符相同

9
我有一个变量 activeUserName 和一个变量 manager1
如何检查activeUserName至少包含三个字符,这些字符在manager1中?(这些字符的位置无关紧要)
例如,在以下情况下,应该返回true,因为字符'J','o'和'e'在manager1中。
var activeUserName = "JohnDoe100";
var manager1 = "JYZALoe999";

目前我正在使用indexOf方法,并且只查看特定位置的字符,这就是为什么我想要进行更改的原因:

if (isEditor == false){
    if (((activeUserName.indexOf(manager1.charAt(0)) !== -1)  && (activeUserName.indexOf(manager1.charAt(2)) !== -1)) || (activeUserName.indexOf(manager1.charAt(4)) !== -1)){
        // doSth();
    } else if (((activeUserName.indexOf(manager2.charAt(0)) !== -1)  && (activeUserName.indexOf(manager2.charAt(2)) !== -1)) || (activeUserName.indexOf(manager2.charAt(4)) !== -1)){
        // doSth();
    } else {
        // doSth();
    }
}

我读过正则表达式相关的内容,但我不确定它是否适用于此。任何帮助都将不胜感激!
9个回答

11

使用.split().filter(),你可以将 activeUserName 转换为数组,并将每个字符与字符串manager1进行过滤:

var activeUserName = "JohnDoe100";
var manager1 = "JYZALoe999";

var howMany = activeUserName.split('').filter(function(e, i, a) {
    return (manager1.indexOf(e) != -1);
}).length;

console.log('The number of chars in common is: ' + howMany);


2

var activeUserName = "JohnDoe100";
    var manager1 = "JYZALoe999";
    const arr1 = [...activeUserName];
    const arr2 = [...manager1];
    let count = 0;
    for (let i = 0; i<arr1.length; i++) {
      if (arr2.indexOf(arr1[i]) !== -1) count++;
    }
if(count >= 3)
  console.log(`string b 3 same values of string b`);


1

我认为这种方法更好,因为我们不需要使用split('')创建一个新数组。

 var activeUserName = "JohnDoe100";
        var manager1 = "JYZALoe999";
        let count = ""
        for (let letter of activeUserName) {
            if (manager1.indexOf(letter) > -1 && status.indexOf(letter) == -1)
                count = count + letter
        }
console.log('Characters in common',count);
console.log('Length',count.length);


1

这个问题可能会有多个条件,比如同一个字符的两个出现应该被视为1或2,大写和小写字母是否相同等等。我只是留下下面的代码片段,以便您了解最终解决方案的要点。除此之外的任何条件,您都可以自行添加。

var activeUserName = "JohnDoe100";
var manager1 = "JYZALoe999";

let count = 0;

[...activeUserName].forEach(char1 => {
    [...manager1].forEach(char2 => {
        // add all your conditions here
        if(char1 === char2)
            count++;
    });
});

console.log(count);

上述代码将输出两个字符串中共同出现的字符数量。

1
将检查字符串按字符拆分为数组。遍历它,如果一个字符包含在字符串中,则将其相加。

var activeUserName = "JohnDoe100";
var manager1 = "JYZALoe999";


function check3Chars(str, check) {
    let count = 0;
    check.split('').forEach( char => {
        if (str.indexOf(char)!=-1) {
            count++;
        }
    });
    return count>=3;
};

console.log(check3Chars(activeUserName, manager1))


1
这是代码(ES5兼容版本)。与其他答案相比,它应该更具性能,因为在找到3个字符后就会停止:

var activeUserName = "JohnDoe100";
var manager1 = "JYZALoe999";

var matchedCharacters = [];
var activeUserNameArray = activeUserName.split('');
for (var i = 0; i < activeUserNameArray.length && matchedCharacters.length < 3; i++) {
  if (
    manager1.indexOf(activeUserNameArray[i]) > -1 // check if both strings include the character
    && matchedCharacters.indexOf(activeUserNameArray[i]) === -1 // exclude duplicates, you can remove this condition if you want to count duplicates
  ) {
    matchedCharacters.push(activeUserNameArray[i]);
  }
}

console.log(matchedCharacters.length);
if (matchedCharacters.length >= 3) {
  // the strings have at least 3 common characters
} else {
  // the strings have less than 3 common characters
}

这是一个ES6版本:

const activeUserName = "JohnDoe100";
const manager1 = "JYZALoe999";

const matchedCharacters = [];
for (const char of activeUserName) {
  if (matchedCharacters.length >= 3) break;
  if (
    manager1.includes(char) // check if both strings include the character
    && !matchedCharacters.includes(char) // exclude duplicates, you can remove this condition if you want to count duplicates
  ) {
    matchedCharacters.push(char);
  }
}

console.log(matchedCharacters.length);

if (matchedCharacters.length >= 3) {
  // the strings have at least 3 common characters
} else {
  // the strings have less than 3 common characters
}


1

代码

// Format the string for easier comparison checking
const prepareString = (str) => str.split("").map((str) => str.toLowerCase());

export function similarCharacters(subject, test) {
  // Prepared subject string
  const left = prepareString(subject);

  // Prepared test string
  const right = prepareString(test);
  // Map over the subject with a number as the initial value, this will be our count
  return left.reduce((acc, curr) => {
    // acc is the current count value
    // curr is the current letter from the subject

    // If the right string has an occurrence of the current letter add 1 to the counter
    if (right.indexOf(curr) > -1) {
      return acc + 1;
    }
    return acc;
  }, 0 /* our initial counter */);
}

单元测试

describe("similarCharacters", () => {
  it.each([
    ["hello", "yellow", 4],
    ["JYZALoe999", "JohnDoe100", 3]
  ])("%s and %s have %p similar characters", (left, right, expected) => {
    expect(similarCharacters(left, right)).toEqual(expected);
  });
});

针对您的使用情况:

const activeUserName = "JohnDoe100";
const manager1 = "JYZALoe999";

const similarCount = similarCharacters(manager1, activeUserName)
if(similarCount >= 3){
 // do something
}

这里是 CodeSandbox: https://codesandbox.io/s/purple-tree-ni8xu?file=/src/similarCharacters.js


1

已经有一些很棒的答案了,我只是想用一行代码加入这个派对,它不会太复杂或难以理解。

const a = "JohnDoe100";
const b = "JYZALoe999";

const total = [...b].reduce((count, char) => count + (a.includes(char) ? 1 : 0), 0);

它的好处在于除了你实际需要的total变量外,不会创建其他额外的变量。

太棒了。谢谢分享。 - stepbysteptomathpro

1

使用for循环和break,使用includes()

为了更加清晰,创建一个能够完成任务的函数。

为了更加高效,在找到3个匹配字符时使用break

优先考虑不使用var,而是使用constlet

const areStringsMatchCharsMoreThen2 = (stringA, stringB) => {
  let count = 0;
  for (let i = 0; i < stringB.length; i++) {
    if (count === 3) break;
    if (stringA.includes(stringB.charAt(i))) count++;
  }
  return count === 3;
}

const activeUser = "JohnDoe100";
const manager = "JYZALoe999";

const areStringsMatchCharsMoreThen2 = (stringA, stringB) => {
  let count = 0;
  for (let i = 0; i < stringB.length; i++) {
    if (count === 3) break;
    if (stringA.includes(stringB.charAt(i))) count++;
  }
  return count === 3;
}

console.log(areStringsMatchCharsMoreThen2(activeUser, manager));
console.log(areStringsMatchCharsMoreThen2('ABC', 'def'));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接