问题描述
我需要检查,如果在字符串中的所有键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'); }
1楼
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方法的文档。
2楼
这样的东西应该涵盖了它:
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
长一点,但是它很彻底,包括空检查。
唯一缺少的是检查所提供的参数是否实际上是字符串。
3楼
var regex = new RegExp('[' + a.replace(/-/g, '|') + '|-]', 'g');
var matches = b.match(regex).length === a.length;
纯正则表达式,并没有得到更好的:-)