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
,使用const
和let
。
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'));
我有一个变量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
,使用const
和let
。
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'));