2016-08-05 50 views
2

您好我需要比较两个字符串,但没有看到排列如何在JavaScript中比较两个字符串,忽略字符排列

一样,如果string1为

var a="apple#1;banana#2;orange#3" 

和String2的是

var b="banana#2;orange#3;apple#1" 

a.compare(b)应该是正确的,因为数值相同只是排列不同

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"); 
     } 
} 
+0

你的意思是实际字符排列或项目的安排?忽略字符排列''annaba#1; norage#2; pleap#3''会匹配。 –

+0

没有第一个将是好的苹果将是苹果,但#后有唯一标识符,所以必须匹配 – Tanmay

回答

2

我觉得@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 

两个字符串在它们中都有相同的字符,但它们绝对不是你想要的方式。

5

这里是一个班轮应该做的伎俩:

string.split('').sort().join('') 

这是通过转将字符串转换为数组,对数组进行排序,然后折叠回字符串(按字符排序)。您可以在两个字符串运行和比较

console.log(a.split('').sort().join('') == b.split('').sort().join('')) // true 

您可以使用ES6和字符串强制让它多一点简洁:

[...a].sort()+'' === [...b].sort()+'' 
+0

嗨,谢谢我检查这与我的代码,如果它的作品将让你知道谢谢反正 – Tanmay

+0

这在某些情况下不起作用。请看下面的答案 – mcgraphix

+0

因此,'foo; bar'与'abr; oof'是“相等的”吗? – georg

1

由于您实际上正在比较,为什么不明确使用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)