2016-10-01 5 views
0

Sehr neu zu Javascript so ertragen mit mir ... Ich muss überprüfen, ein Element eines Arrays (arr [1]), die eine Zeichenfolge enthält, gegen ein anderes Element des gleichen Arrays (arr [0]) zu bestimmen wenn in element arr [1] enthaltene Buchstaben in arr [0] enthalten sind. Diese Buchstaben können in beliebiger Reihenfolge stehen, in Groß- oder Kleinbuchstaben, und müssen nicht die gleiche Anzahl von Malen vorkommen (d. H. Arr [0] = "hheyyy" und arr [1] = "hey" ist in Ordnung). Das ist, was ich habe (was funktioniert), aber ich war neugierig, ob jemand einen besseren/einfacheren Weg hat, dies zu tun? -Danke im Voraus.Wie überprüft man, ob ein Element eines Arrays mit einem anderen Element in demselben Array übereinstimmt?

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

[Diese Antwort] (http://stackoverflow.com/a/18692301/4256677) kann eine Idee für eine gute Lösung – varontron

Antwort

0

Sie können einen regulären Ausdruck verwenden:

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

Dieses mit Backslash jedes Zeichen in der zweiten Saite entkommt (so kann es nicht mit regulären Ausdrücken Syntax in Konflikt geraten), umgibt sie mit eckigen Klammern und Verwendungen das als Suchmuster auf der ersten Zeichenfolge. Irgendwelche Übereinstimmungen (case-insensitive) werden aus dem Ergebnis entfernt, so dass nur Zeichen übrig bleiben, die in der zweiten Zeichenfolge nicht vorkommen. Die Länge des Ergebnisses ist somit ein Hinweis darauf, ob Erfolg erzielt wurde oder nicht. Das Anwenden der ! darauf gibt das korrekte boolesche Ergebnis.

Dies ist möglicherweise nicht die schnellste Lösung.

Hier ist eine weitere ES6 Alternative eine Set für eine gute Leistung mit:

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

Pflege bieten eine Erklärung zu bieten, wie Sie Ihre Lösung funktioniert – bhspencer

+0

Added Erklärung und eine alternative Lösung. – trincot

+0

So funktioniert die erste Funktion, die Sie bereitgestellt haben, bis auf einige ausgewählte Situationen. Zum Beispiel kommt Mutation (["floor", "für"]) falsch vor. Die Mutation (["floorf", "für"]) ist jedoch wahr. Das gleiche Muster gilt für alles, was mit b-f beginnt und ich kann nicht für das Leben von mir herausfinden, warum. irgendwelche Ideen? -thanks – bleuz

0

Sie Array.from() String in ein Array umwandeln können, Array.prototype.every(), String.prototype.indexOf() wenn jeder charactcer in String Array umgewandelt einzuchecken enthalten ist Zeichenfolge eines anderen Array-Elements.

var arr = ["abc", "cab"]; 
 
              
 
var bool = Array.from(arr[0]).every(el => arr[1].indexOf(el) > -1); 
 

 
console.log(bool);

Verwandte Themen