JavaScript 检查字符串是否至少有三个字符在另一个变量中

JavaScript to check if string has at least three characters that are in another variable

我有一个变量activeUserName和一个变量manager1

如何检查 activeUserName 是否至少包含三个字符,它们在 manager1 中? (这些字符的位置无关紧要)

例如下面的例子,它应该return为真,因为字符'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();
    }
}

我阅读了有关 Regex 的内容,但不确定是否可以在此处应用。

感谢任何帮助!

结合 .split() with .filter() 你可以在数组中转换 active UserName 并根据字符串 manager 1:[= 过滤每个字符12=]

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);

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`);

我认为这种方法更好,因为我们不必使用 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 或 2,是否应将大写和小写字符视为相同等。我将其留在下面code-snippet 以便您了解最终解决方案的要点。除此之外的任何条件,您都可以自己添加。

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);

以上代码将输出两个字符串中共有的字符数。

从字符数组中拆分 check-string。如果 str 中包含一个 char 并对其求和,则遍历它。

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))

这是代码(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
}

代码

// 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

已经有一些很好的答案,只是想加入一个不太hacky或不可读的单行本聚会。

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

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

它的好处是除了 total 您实际需要的变量之外,不创建其他变量。

使用带 break 的 For 循环并使用 includes()

To be clean, make a function that will do the job.

To be efficent use break when you find 3 match chars.

更喜欢而不是使用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'));