如何比较 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)