2017-02-03 6 views
3

Wenn ich ein Duplikat auf dem ersten Teil des Elements habe, möchte ich das größte zurückgeben. Ich habe das Array sortiert und es sieht so aus:Javascript gibt das größte in Schleife zurück

var sortedMyArray = ["4ff02829-df7e/0", "4ff02829-df7e/10", "8c138c02-c139/37", "54be465f-0c03/41", "b2036e03-384f/4", "b2036e03-384f/32", "b2036e03-384f/35"]; 

Mein erwartetes Ergebnis ist:

["4ff02829-df7e/10", "8c138c02-c139/37", "54be465f-0c03/41", "b2036e03-384f/35"];

Mein Code so weit ist:

for(var i=0;i<sortedMyArray.length;i++){ 
        for (var k = i + 1; k < sortedMyArray.length; k++) { 
        if(sortedMyArray[i].split('/')[0] == sortedMyArray[k].split('/')[0]){ 
          console.log('First values of element equal so remove the smallest element'); 

          if(sortedMyArray[i].split('/')[1]<sortedMyArray[k].split('/')[1]){ 
           sortedMyArray.splice(sortedMyArray[i],1); 
          } 
         } 
        } 
        } 

Antwort

3

Da Sie Array sortiert, können Sie einfach jedes Element herausfiltern, das ein nächstes Element mit der gleichen Zeichenfolge bis zum '/':

hat
result = sortedMyArray.filter(function (el, i) { 
    if (i + 1 === sortedMyArray.length) 
     return true; 
    return el.split('/')[ 0 ] !== sortedMyArray[ i + 1 ].split('/')[ 0 ]; 
}); 

Dies setzt voraus, dass Ihr Array korrekt sortiert ist, so dass Sie immer den letzten Eintrag mit jedem Präfix behalten möchten. Nur für den Fall, ich schlage vor, dass Sie überprüfen, dass Ihre Sortierung sich so verhält, wie Sie wollen für Fälle, die auf /2 und /10 enden.

+0

' "b2036e03-384f/4"' kommt vor ' "b2036e03-384f/32"' so der Sortieralgorithmus korrekt sein aussieht. –

1

Dies verwendet Array.reduce(), um den ersten Teil jedes Elements und das vollständige Element als Schlüssel/Wert-Paare in ein Objekt einzufügen. Bei doppelten Schlüsseln wird der Wert nach dem Schrägstrich verglichen, um den größeren Wert zu speichern. Dann werden alle Werte in einem Array zurückgegeben.

var sortedMyArray = ["4ff02829-df7e/0", "4ff02829-df7e/10", "8c138c02-c139/37", "54be465f-0c03/41", "b2036e03-384f/4", "b2036e03-384f/32", "b2036e03-384f/35"]; 

var reduced = Object.values(sortedMyArray.reduce((acc, val) => { 
    const [ preSlash, postSlash ] = val.split('/'); 

    if (acc[preSlash]) { 
    const stored = acc[preSlash].slice(acc[preSlash].indexOf('/')); 
    return postSlash > stored 
     ? Object.assign(acc, { [preSlash]: val }) 
     : acc; 
    } else { 
    return Object.assign(acc, { [preSlash]: val }); 
    } 
}, {})); 

console.log(Object.values(reduced)); 

https://jsfiddle.net/g2rkmn9m/

1

Array#reduce Verwenden der Anordnung mit einem Objekt wie dem Akkumulator iterieren.

Bei jeder Iteration teilen Sie das Element durch das Trennzeichen und verwenden Sie das erste Element des Ergebnisses als Eigenschaft, um es entweder zu initialisieren oder auf das aktuelle Element zu aktualisieren.

Schließlich Object.values verwenden, um ein Array der einzigartigen Elemente zu erhalten.


Benchmarking zeigt dies als beide zum Zeitpunkt der Entsendung der anderen Methoden schneller zu sein.

var sorted = ["4ff02829-df7e/0", "4ff02829-df7e/10", "8c138c02-c139/37", "54be465f-0c03/41", "b2036e03-384f/4", "b2036e03-384f/32", "b2036e03-384f/35"]; 
 
var unique = sorted.reduce((u, e) => ((u[e.split('/')[0]] = e), u), {}); 
 
console.log(Object.values(unique));

Verwandte Themen