当前位置: 代码迷 >> JavaScript >> 如何在不考虑顺序的情况下检查另一个字符串中是否存在由仲裁字符分隔的某些单词
  详细解决方案

如何在不考虑顺序的情况下检查另一个字符串中是否存在由仲裁字符分隔的某些单词

热度:68   发布时间:2023-06-13 12:10:28.0

我需要检查,如果在字符串中的所有键a存在于字符串b (关键是例如CTRL)。

键始终以“-”分隔。

我需要比较返回true与b中的键顺序无关。 键不能在字符串中重复,例如CTRL-SHIFT-CTRL-C返回false。

var a = 'CTRL-SHIFT-C';  
var b = 'CTRL-SHIFT-C';

比较结果示例:

var a = 'CTRL-SHIFT-C';  
var b = 'C-SHIFT-CTRL'; // true

var a = 'CTRL-SHIFT-C';  
var b = 'SHIFT-C-CTRL'; // true

var a = 'CTRL-SHIFT-C';  
var b = 'CTRL-SHIFT-C-D'; // false

目前,我正在使用此代码,但在某些情况下无法正常工作。

 var a = 'CTRL-SHIFT-A'; // does no work var b = 'SHIFT-A'; var aPart = a.split('-'); var bPart = b.split('-'); var intersection = aPart.filter(function (n) { return bPart.indexOf(n) != -1; }); if (intersection.length !== bPart.length) { alert('different keys'); } else { alert('same keys'); } 

function compare(s1, s2) {
    s1 = s1.split('-');
    s2 = s2.split('-');
    return (s1.length === s2.length) && (s1.every(function (elem) {
         return (s2.indexOf(elem) !== -1);
    }));
}

var a = 'CTRL-SHIFT-C';  
var b = 'C-SHIFT-CTRL'; // true

console.log(compare(a, b));

a = 'CTRL-SHIFT-C';  
b = 'SHIFT-C-CTRL'; // true

console.log(compare(a, b));

a = 'CTRL-SHIFT-C';  
b = 'CTRL-SHIFT-C-D'; // false

console.log(compare(a, b));

您可以在查看Array.prototype.every方法的文档。

这样的东西应该涵盖了它:

 var a = 'CTRL-SHIFT-C'; var b = 'C-SHIFT-CTRL'; function compareStrings(a, b){ if(a === b) // Same strings return true if(!a || !b || a.length !== b.length) // Strings are falsy or don't have the same length. return false var splitA = a.split('-').sort(), // Sort the keys splitB = b.split('-').sort(); if(splitA.length !== splitB.length) // Unequal amount of keys > false return false for(var i = 0; i < splitA.length; i++){ if(splitA[i] !== splitB[i] || // Keys mismatch > false (i > 0 && splitA[i] == splitA[i-1])) // Duplicate keys > false return false; // (You don't have to check b for duplicates, since b has to match a) } return true; // All is good, the strings match. > true } alert(compareStrings(a, b)) 

当然,它比every方法every长一点,但是它很彻底,包括空检查。 唯一缺少的是检查所提供的参数是否实际上是字符串。

var regex = new RegExp('[' + a.replace(/-/g, '|') + '|-]', 'g');
var matches = b.match(regex).length === a.length;

纯正则表达式,并没有得到更好的:-)

  相关解决方案