2016-05-21 9 views
1

Ich lerne Javascript von einem Kratzer und ein Online-Kurs gab mir eine Suche, um herauszufinden, die größte Anzahl von vorgegebenen Bereich der Zahlen mit Javascript.Javascript Anfänger fragt nach Code Verbesserung - Größte Nummer Aufgabe

ist, was ich gemacht:

function biggest(array) { 
for (var i = 0; i < array.length; i++) { 
    if (array[i] > array[i+1]) { 
    if (array[i] >= array[0]) { 
     array[0] = array[i]; 
    } 
    } 
    else { 
    if (array[i+1] >= array[0]) { 
     array[0] = array[i+1]; 
    } 
    } 
} 
    return array[0]; 
} 

var array = [10,12,15,3,5,22,2]; 
console.log(biggest(array)); 

Ich habe es auf codepen here.

Könnten Sie mir bitte sagen, wie man diese Funktion macht sogar besser? Ich glaube, es ist nicht der effizienteste Weg, der Ausführungskontext muss das ganze Array für den gesamten Zeitraum halten, aber ich denke, dass das Löschen einiger Indizes die Prozesszeit erhöhen könnte.

Vielen Dank für Ihre Vorschläge.

+6

Das gehört auf Code-Review . Gut für Sie, wenn Sie Ihren Code verbessern möchten! http://codereview.stackexchange.com/ – DeeDee

+0

danke, ich hätte über das Feature –

+0

gewusst haben, glaube ich, http://codereview.stackexchange.com/ wäre für diese Frage geeigneter. –

Antwort

6

Zuerst den ersten Wert auf Maximum stellen und dann einen größeren Wert als diesen prüfen, durch den vorherigen Maximalwert mit dem aktuellen Maximalwert ersetzen.

So:

var max = array[0]; 
for (var i = 1; i < array.length; i++) { 
    if (max < array[i]) 
     max = array[i]; 
} 
    return max; 

DEMO

+2

Um es noch besser zu machen, könnten Sie vermeiden, die Länge des Arrays bei jeder Iteration zu berechnen: 'für (var i = 1, l = array.length; i blex

+1

* array.length * @blex –

4

Leistung so gut wie nie ankommt. Vor allem in Javascript. Es ist wichtiger, Code zu schreiben, der lesbar und wartbar ist.

Ihr Code ändert das Array, was das zweite nicht möglich macht, weil nach einem Aufruf von bigest() das Array anders ist.

würde ich so etwas wie dies vorschlägt:

function biggest(array) 
{ 
    return array.reduce((acc, curr) => acc < curr ? curr : acc); 
} 
+0

Danke, ich habe die Antwort von Anik oben markiert, wegen des bereitgestellten Codes, den ich verstehe. Aber was Sie über die Lesbarkeit und Wartbarkeit geschrieben haben, hat wirklich etwas in mir hinterlassen und ich sehe jetzt, was mit meinem Code nicht stimmt. –

+0

@Adam Rajnoha reduzieren Aufrufe eine Funktion rekursiv auf einem Array. Der erste Parameter ist das Ergebnis aller Funktionsaufrufe, der zweite ist der aktuelle Wert. Hier ist eine sehr gute Erklärung: https://youtu.be/Wl98eZpkp-c – SuperManitu

+0

FYI, Sie fehlen eine schließende Klammer. – Marcus

2

Es ist eine gute Praxis, dass die angegebenen Parameter in einer Funktion zu ändern. Iterate durch Array und wenn das aktuelle Objekt bisher größer als max ist; setze max auf den aktuellen Gegenstand. Und gesetzt auch das erste Element Initialisierung auch hier auf max ist die Funktion:

function biggest(givenArray){ 
    givenArray = givenArray || []; 
    var max = undefined; 
    for(var i = 0; i < givenArray.length; i++){ 
     if(max === undefined || max < givenArray[i]){ 
      max = givenArray[i]; 
     } 
    } 
    return max; 
} 
+0

'Funktion größte (gegebeneArray) { var max = 0; für (var i = 0; i

+0

Nun, wenn alle Elemente im Array negative Zahlen sind, wird es nicht funktionieren. – cubbuk

+0

Das ist richtig. Wenn jedoch alle Elemente des Arrays negative Zahlen sind, würde dies den Fall ändern. Würden wir nicht stattdessen nach max negativ suchen, oder würden wir? Denn in diesem Fall würde er stattdessen die negative Mindestanzahl zurückgeben. :) Es scheint, dass die Verwendung der Array-Sortierung, die mit einer Sortierregel und einem zweiten Argument versehen ist, das es uns ermöglicht, auch die Rückgabe anzupassen, der beste Weg wäre. Aber das kommt immer als zweiter Gedanke. Wie auch immer, das braucht eine Abstimmung. –

0

Wenn Sie schauen, um einfach die größte Zahl in einem Satz zu finden (Array), werden die folgenden wären die verein IMO-Ansatz (mit ES6):

function biggest(array) { 
    return Math.max(...array) 
} 
biggest([10, 12, 15, 3, 5, 22, 2]) // 22 

Math.max() wird kein Array als Argument akzeptieren, so dass wir eine spread passieren, die den Ausdruck (Array) ermöglicht in getrennte Argumente erweitert werden. Dies ermöglicht uns, Math.max() ohne Fehler zu verwenden.

Alternativ würden wir Function.prototype.apply() verwenden, um die gleiche Ausgabe zu erreichen.

function biggest(array) { 
    return Math.max.apply(null, array) 
} 
biggest([10, 12, 15, 3, 5, 22, 2]) // 22 

arrow functions Mit wir können (wohl) bieten ein noch höheres Maß an Funktions Klarheit, während immer noch die Verwendung von Spread Operator unsere Argument-Liste erstellen innerhalb Math.max():

const biggest = array => Math.max(...array) 
biggest([10, 12, 15, 3, 5, 22, 2]) // 22