Javascript 测试字符串是否包含组成另一个字符串的所有字符

Javascript 测试字符串是否包含组成另一个字符串的所有字符,javascript,regex,string,algorithm,Javascript,Regex,String,Algorithm,我试图使用Javascript查看某个字符串是否包含构成另一个字符串的所有字符 例如,单词“hello”包含组成单词“hell”的所有字符。“hellowy”包含组成单词“yellow”的所有字符 最重要的是,无论两个字符串中的字符顺序如何,该方法都需要工作。此外,字符的数量也很重要。“Hel”并不包含组成“地狱”的所有字符。这严格地说是指字符数:一个需要两个l来组成“地狱”,而“Hel”只有一个 为了进一步澄清这个问题,我不担心在由字符串的字符组成子字符串之后,是否会留下一些“未使用”的字符。

我试图使用Javascript查看某个字符串是否包含构成另一个字符串的所有字符

例如,单词“hello”包含组成单词“hell”的所有字符。“hellowy”包含组成单词“yellow”的所有字符

最重要的是,无论两个字符串中的字符顺序如何,该方法都需要工作。此外,字符的数量也很重要。“Hel”并不包含组成“地狱”的所有字符。这严格地说是指字符数:一个需要两个l来组成“地狱”,而“Hel”只有一个

为了进一步澄清这个问题,我不担心在由字符串的字符组成子字符串之后,是否会留下一些“未使用”的字符。也就是说,“helll”仍然应该包含单词“hell”的所有字母

我如何才能有效地完成这项工作?也许有一个正则表达式解决方案?速度是个问题,但并非绝对关键。

您可以使用:

每个
将在第一个falsy值中失败,然后它不会搜索每个字母。

您可以使用:

每个
将在第一个falsy值中失败,然后它不会搜索每个字母。

编辑,更新

此外,字符的数量也很重要。“Hel”不包含 所有角色组成“地狱”

您可以使用变量来存储
布尔值,
for..of
循环,
字符串.prototype.indexOf()
检查,设置
布尔值
变量,
如果
错误
则中断
循环

您还应该能够检查输入字符串
.length
是否等于匹配字符串
.length
条件下,如果两个字符串
.length
属性不相等,则将变量设置为
false

var str = "hell";
var match = "hel";
var bool = true; 
for (var prop of str) {
  if (str.length !== match.length || match.indexOf(prop) === -1) {
    bool = false; break;
  }
};
console.log(bool); // false
编辑,更新

此外,字符的数量也很重要。“Hel”不包含 所有角色组成“地狱”

您可以使用变量来存储
布尔值,
for..of
循环,
字符串.prototype.indexOf()
检查,设置
布尔值
变量,
如果
错误
则中断
循环

您还应该能够检查输入字符串
.length
是否等于匹配字符串
.length
条件下,如果两个字符串
.length
属性不相等,则将变量设置为
false

var str = "hell";
var match = "hel";
var bool = true; 
for (var prop of str) {
  if (str.length !== match.length || match.indexOf(prop) === -1) {
    bool = false; break;
  }
};
console.log(bool); // false

如果字母的数量很重要,那么可能是这样的:

function test(string, substring) {
    var regexp = new RegExp(substring.split("").sort().map(function(s) { return s + "+"; }).join(""));
    return regexp.test(string.split("").sort().join(""));
}
这比上面的答案慢,但如果字符串中有一些重复,则可以缓存并获得比其他答案更好的速度性能:

var cache1 = { };
var cache2 = { };
function test2(string, substring) {
    var regexp = cache1[substring];
    if (!regexp) {
        regexp = new RegExp(substring.split("").sort().map(function(s) { return s + "+"; }).join(""));
        cache1[substring] = regexp;
    }

    var string2 = cache2[string];
    if (!string2) {
        string2 = string.split("").sort().join("");
        cache2[string] = string2;
    }

    return regexp.test(string2);
}

如果字母的数量很重要,那么可能是这样的:

function test(string, substring) {
    var regexp = new RegExp(substring.split("").sort().map(function(s) { return s + "+"; }).join(""));
    return regexp.test(string.split("").sort().join(""));
}
这比上面的答案慢,但如果字符串中有一些重复,则可以缓存并获得比其他答案更好的速度性能:

var cache1 = { };
var cache2 = { };
function test2(string, substring) {
    var regexp = cache1[substring];
    if (!regexp) {
        regexp = new RegExp(substring.split("").sort().map(function(s) { return s + "+"; }).join(""));
        cache1[substring] = regexp;
    }

    var string2 = cache2[string];
    if (!string2) {
        string2 = string.split("").sort().join("");
        cache2[string] = string2;
    }

    return regexp.test(string2);
}

进行一些培训我想出了一个办法:

function test(str, substring) {
  var arr_str = str.toLowerCase().split('');
  var arr_substr = substring.toLowerCase().split('');

  return arr_substr.filter(function(each) {
    return arr_str.indexOf(each) === -1;
  }).length === 0;
}

console.log(test("Alien", "line")); // true
console.log(test("Hello", "hello")); // true
console.log(test("hello", "hey")); // false

进行一些培训我想出了一个办法:

function test(str, substring) {
  var arr_str = str.toLowerCase().split('');
  var arr_substr = substring.toLowerCase().split('');

  return arr_substr.filter(function(each) {
    return arr_str.indexOf(each) === -1;
  }).length === 0;
}

console.log(test("Alien", "line")); // true
console.log(test("Hello", "hello")); // true
console.log(test("hello", "hey")); // false

这个符号是做什么的
[…string]
另外,
集是内置的JS功能吗?明白了。如果不允许重复,这仍然有效吗?也就是说,如果
string=“hel”
substring=“hell”
函数应该返回false。换句话说,字符的数量很重要。例如,它可能是:
((新设置).add,mySet)
@guest271314此时您或我对此无能为力。还有,这就是为什么我会投票给所有试图回答我问题的人。这个符号有什么作用
[…string]
另外,
集是内置的JS功能吗?明白了。如果不允许重复,这仍然有效吗?也就是说,如果
string=“hel”
substring=“hell”
函数应该返回false。换句话说,字符的数量很重要。例如,它可能是:
((新设置).add,mySet)
@guest271314此时您或我对此无能为力。还有,这就是为什么我会投票给所有试图回答我问题的人。“Hel”并不是包含所有组成“hell”的字符<代码>“hell”
确实包含构成
“hell”
的所有字符。你是说区分大小写吗?不是。只是指字符的数量。你们需要两个l来表示“地狱”这个词,而“地狱”只有一个。注意,这是一个重要的要求,在最初的问题中似乎并没有包括在内?您应该能够检查输入字符串
。长度
等于匹配的字符串
。长度
我现在要添加它。“Hel”不包含组成“hell”的所有字符。“”<代码>“hell”
确实包含构成
“hell”
的所有字符。你是说区分大小写吗?不是。只是指字符的数量。你们需要两个l来表示“地狱”这个词,而“地狱”只有一个。注意,这是一个重要的要求,在最初的问题中似乎并没有包括在内?您应该能够检查输入字符串
。长度
等于匹配字符串
。长度
我现在将添加它。