2016-10-31 4 views
-1

Ich versuche, das größte Element im Array zurückzugeben. Bei Strings bedeutet dies die längste Zeichenfolge. Wie gebe ich nur die erste Instanz des größten Elements zurück.gibt nur den ersten Wert des größten Elements zurück

Mein Code:

function getLongestElement(arr) { 
    var max = ""; 
    var counter = 0; 
    for (var i = 0; i < arr.length; i++){ 
     if (arr[i].length > counter) max = arr[i] 
     } 
    return max; 
} 

getLongestElement(['one', 'two', 'three', "thre1"]); // "thre1" not "three". 

Ich bin mir nicht ganz sicher, was falsch mit diesem Code. Unabhängig vom größten Wert gibt es nur das letzte Element im Array zurück. Hilfe?

+1

Sie aktualisieren nie 'counter'. ALLES ist größer als Null, wenn Sie also das Array '[" a "," bb "," c "]' hätten, würden Sie '" c "' zurückbekommen. – vlaz

+2

'zurück arr.reduce ((p, c) => c.length> p.length? C: p);' – ASDFGerte

Antwort

2

counter wird auf 0 initialisiert, aber Sie ändern seinen Wert nie, sodass die if-Anweisung mit arr[i].length > counter immer wahr ist (es sei denn, arr[i].length == 0). Um es zu beheben Sie den Überblick über das größte Element des Arrays innerhalb der Schleife halten müssen:

// I renamed counter to maxLength for readability 
function getLongestElement(arr) { 
    var max; 
    var maxLength = -1; 
    for (var i = 0; i < arr.length; i++){ 
     if (arr[i].length > maxLength){ 
     maxLength = arr[i].length; 
     max = i; 
     } 
    } 
    return arr[max]; 
} 
+0

'zurück arr [i];' Ich glaube nicht, dass das richtig ist. – vlaz

+0

Sollte 'Return arr [max]' sein. – Barmar

+0

Ja, du hast Recht, ich habe die Antwort aktualisiert – Andrew

1

Zunächst sollte gut alghoritm keine Annahmen machen. Das bedeutet, dass Ihre max nicht von "" beginnen sollte, sondern das erste Element des Arrays verwenden soll. Sie bearbeiten auch nicht Ihren counter Wert, das ist Ihr Hauptproblem. Aber es ist redundant und Sie können diese Funktion ohne counter schreiben.

function getLongestElement(arr) { 
    if (arr.length < 1) return /* Some Exception */; 
    var max = arr[0]; 
    for (var i = 1; i < arr.length; i++) { 
     if (arr[i].length > max.length) max = arr[i]; 
    } 
    return max; 
} 
+0

Eine Zeichenkette kann niemals kürzer sein als '" "', also beginnt man von '" "' nicht wirklich etwas anzunehmen. – Barmar

+0

Ja, vielleicht war ich zu streng. Die einzige Situation wäre ein leeres Array. Ich meine, dass Sie keinen Unterschied zwischen einem leeren Array oder Array mit nur leeren Strings sehen würden. Aber das ist kein Problem, wie Sie gesagt haben. –

1

Sie haben vergessen counter

function getLongestElement(arr) { 
 
    var max = ""; 
 
    var counter = 0; 
 
    for (var i = 0; i < arr.length; i++){ 
 
     if (arr[i].length > counter) { 
 
     max = arr[i]; 
 
     counter = max.length; 
 
     } 
 
     } 
 
    return max; 
 
} 
 

 
console.log(getLongestElement(['one', 'two', 'three', "thre1"])); // "thre1" not "three".

0

zu aktualisieren Wenn Sie sich für eine pragmatische Lösung suchen, würde ich lodash die vorschlagen _.maxBy:

_.maxBy(['one', 'two', 'three', "thre1"], function(str) { 
    return str.length; 
}) 

Wenn du suchst einen th eoretical Lösung zum Wohle des Lernens,

function getLongestElement(arr) { 
    var max; 
    var counter = 0; 

    for (var i = 0; i < arr.length; i++){ 
    if (arr[i].length > counter) max = arr[i] 
    counter = Math.max(arr[i].length, counter) 
    } 

    return max; 
} 

Der entscheidende Punkt hier ist, um sicherzustellen, dass Sie die counter Variable sind die Aktualisierung auf das, was die derzeit längste Länge ist.

+0

'arr [i] .length> counter' wird niemals wahr sein, weil Sie' counter' auf 'arr [i] .length' in der vorherigen Zeile setzen. – Barmar

+0

@Barmar Ich glaube, ich setze 'counter' auf das, was höher ist:' counter' oder 'arr [i] .length' (mit' Math.max'). –

+0

Aber Sie setzen es * vor * Sie testen die Länge des aktuellen Elements. Wenn also das aktuelle Element länger ist als 'counter', wird 'counter' auf seine Länge gesetzt, dann testet man, ob es länger als' counter' ist. – Barmar

Verwandte Themen