如何比较 javascript 中的两个字符串忽略字符排列
How to compare two string in javascript neglecting character arrangement
嗨,我需要比较两个字符串,但没有看到排列
如果 string1 是
var a="apple#1;banana#2;orange#3"
并且 String2 是
var b="banana#2;orange#3;apple#1"
a.compare(b) 应该给出 true 因为值相同只是排列不同
if(!a.compare(b)){
alert("not matched");
}
else{
alert("matched");
}
我做了一个,但是它的代码太长了,我在这里分享它:
function ReturnCollection (str){
var arr=str.split(';');
var returnarr=[];
for(var i=0;i<arr.length;i++){
var indx=arr[i].indexOf('#');
var text=arr[i].substr(0,indx);
var val=arr[i].substr(indx+1);
returnarr.push([text,val]);
}
return returnarr;
}
function Matching(){
var afinal=ReturnCollection(a);
var bfinal=ReturnCollection(b);
bflag=false;
outerloop:
for(i=0;i<afinal.length;i++){
for(j=0;j<bfinal.length;j++){
if(bfinal[j][1] === afinal[i][1]){
continue outerloop;
}
}
bflag=true;
break outerloop;
}
if(bflag){
alert("not matched");
}
}
这是一个应该可以解决问题的单行代码:
string.split('').sort().join('')
它的工作原理是将字符串转换为数组,对数组进行排序,然后折叠回字符串(按字符排序)。您可以 运行 在两个字符串上比较
console.log(a.split('').sort().join('') == b.split('').sort().join('')) // true
您可以使用 ES6 和字符串强制转换使其更简洁:
[...a].sort()+'' === [...b].sort()+''
我认为@Rob 走在正确的道路上,但我会在分号处拆分它:
var a="apple#1;banana#2;orange#3";
var b="banana#2;orange#3;apple#1"
console.log(a.split(";").sort().join(";") === b.split(";").sort().join(";"));
因为如果你只是把它拆分成一个空字符串,你会得到一个字符数组,但你真正想要的是一个单词数组,否则你也会这样:
var a = "apple#1;bananas#2;orange#3";
var b = "banana#2;orranges#3;apple#1";
console.log(a.split(";").sort().join(";") === b.split(";").sort().join(";")); //false
console.log(a.split("").sort().join("") === b.split("").sort().join("")); //true
两个字符串中包含相同的字符,但它们绝对不是您想要的方式。
既然你实际上是在比较组,为什么不明确地使用Set
呢?
var a = "apple#1;banana#2;orange#3"
var b = "banana#2;orange#3;apple#1"
var sa = new Set(a.split(';'))
var sb = new Set(b.split(';'))
areEqual = sa.size == sb.size && [...sa].every(x => sb.has(x))
console.log(areEqual)
嗨,我需要比较两个字符串,但没有看到排列
如果 string1 是
var a="apple#1;banana#2;orange#3"
并且 String2 是
var b="banana#2;orange#3;apple#1"
a.compare(b) 应该给出 true 因为值相同只是排列不同
if(!a.compare(b)){
alert("not matched");
}
else{
alert("matched");
}
我做了一个,但是它的代码太长了,我在这里分享它:
function ReturnCollection (str){
var arr=str.split(';');
var returnarr=[];
for(var i=0;i<arr.length;i++){
var indx=arr[i].indexOf('#');
var text=arr[i].substr(0,indx);
var val=arr[i].substr(indx+1);
returnarr.push([text,val]);
}
return returnarr;
}
function Matching(){
var afinal=ReturnCollection(a);
var bfinal=ReturnCollection(b);
bflag=false;
outerloop:
for(i=0;i<afinal.length;i++){
for(j=0;j<bfinal.length;j++){
if(bfinal[j][1] === afinal[i][1]){
continue outerloop;
}
}
bflag=true;
break outerloop;
}
if(bflag){
alert("not matched");
}
}
这是一个应该可以解决问题的单行代码:
string.split('').sort().join('')
它的工作原理是将字符串转换为数组,对数组进行排序,然后折叠回字符串(按字符排序)。您可以 运行 在两个字符串上比较
console.log(a.split('').sort().join('') == b.split('').sort().join('')) // true
您可以使用 ES6 和字符串强制转换使其更简洁:
[...a].sort()+'' === [...b].sort()+''
我认为@Rob 走在正确的道路上,但我会在分号处拆分它:
var a="apple#1;banana#2;orange#3";
var b="banana#2;orange#3;apple#1"
console.log(a.split(";").sort().join(";") === b.split(";").sort().join(";"));
因为如果你只是把它拆分成一个空字符串,你会得到一个字符数组,但你真正想要的是一个单词数组,否则你也会这样:
var a = "apple#1;bananas#2;orange#3";
var b = "banana#2;orranges#3;apple#1";
console.log(a.split(";").sort().join(";") === b.split(";").sort().join(";")); //false
console.log(a.split("").sort().join("") === b.split("").sort().join("")); //true
两个字符串中包含相同的字符,但它们绝对不是您想要的方式。
既然你实际上是在比较组,为什么不明确地使用Set
呢?
var a = "apple#1;banana#2;orange#3"
var b = "banana#2;orange#3;apple#1"
var sa = new Set(a.split(';'))
var sb = new Set(b.split(';'))
areEqual = sa.size == sb.size && [...sa].every(x => sb.has(x))
console.log(areEqual)