2016-10-01 155 views
0

非常新的JavaScript所以忍受着我... 我需要检查包含一个字符串的数组(arr [1])中的一个元素与同一数组的另一个元素(arr [0])以确定如果元素arr [1]中包含的任何字母包含在arr [0]中。这些字母可以是任意顺序,大写或小写,并且不必出现相同的次数(即,arr [0] =“hheyyy”并且arr [1] =“hey”可以)。这是我的(有效),但我很好奇,如果任何人有更好/更简单的方法做到这一点? -提前致谢。如何检查数组中的一个元素是否与同一数组中的另一个元素匹配?

function mutation(arr) { 
    //splits the array into two separate arrays of individual letters 
     var newArr0 = arr.join('').toLowerCase().split('').slice(0,arr[0].length); 
     var newArr1 = arr.join('').toLowerCase().split('').slice(arr[0].length); 
     var boolArr = []; 
    //checks each letter of arr1 to see if it is included in any letter of arr0 
     for(var i = 0; i < newArr1.length; i++) 
     boolArr.push(newArr0.includes(newArr1[i])); 
    //results are pushed into an array of boolean values 
     if (boolArr.indexOf(false) !==-1) 
     return false; //if any of those values are false return false 
     else return true; 
    } 

    mutation(["hello", "hey"]); //returns false 
+0

[这个答案](http://stackoverflow.com/a/18692301/4256677)可以为好的解决方案提供一种思路 – varontron

回答

0

你可以使用正则表达式:

function mutationReg(arr) { 
    return !arr[1].replace(new RegExp('['+arr[0].replace(/(.)/g,'\\\\$1')+']', "gi"), '').length; 
} 

该逃逸的每个字符的第二串用反斜杠(所以不能用正则表达式语法冲突),方括号,并且使用围绕它作为第一个字符串的搜索模式。从结果中删除任何匹配(不区分大小写),以便只留下不会出现在第二个字符串中的字符。因此结果的长度表明是否成功。对其应用!可以给出正确的布尔结果。

这可能不是最快的解决方案。

下面是一个使用Set良好性能的另一个ES6选择:

function mutation(arr) { 
    var chars = new Set([...arr[0].toLowerCase()]); 
    return [...arr[1].toLowerCase()].every (c => chars.has(c)); 
} 
+0

关怀为您的解决方案是如何工作的 – bhspencer

+0

加任何解释说明和另一种解决方案。 – trincot

+0

所以你提供的第一个功能除了一些选择的情况外很好。例如,突变([“floor”,“for”))出现错误。然而,变异([“floorf”,“for”])是真实的。对于任何以b-f开头的事物而言,这种模式都是正确的,而我不能为我的生活找出原因。有任何想法吗? - 谢谢 – bleuz

0

您可以使用Array.from()字符串转换成数组,Array.prototype.every()String.prototype.indexOf()检查,如果在字符串中的每个charactcer转换成数组包含在其他数组元素的字符串。 ​​

相关问题