2015-09-24 10 views
5

Mam następujący problem, moja funkcja akceptuje tablicę zawierającą 4 tablice, każdy element jest liczbą. Funkcje muszą zwracać największy element każdej tablicy.Dlaczego 857 jest większe niż 1000 i 1001? JavaScript

function largestOfFour(arr) { 
    var largest = []; 
    for (var i = 0; i < arr.length; i++) { 
    largest.push(arr[i].sort().pop()); 
    } 
    console.log(largest); 
    return largest; 
} 

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); 

Wyniki:

Array [ 5, 27, 39, 857 ] 

Widocznie to działa, ale kiedy próbowałem z ostatniej tablicy [1000, 1001, 857, 1], w którym 1000 i 1001 są większe niż 857 mi uzyskanie 857. Dlaczego tak się dzieje?

+2

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max –

Odpowiedz

10

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

wartości tablicowe są klasyfikowane jako łańcuchy. Jeśli chcesz sortować jako liczby, użyj niestandardowej funkcji porównującej.

Od docs MDN:

var numberArray = [40, 1, 5, 200]; 

function compareNumbers(a, b) { 
    return a - b; 
} 

console.log('numberArray:', numberArray.join()); 
console.log('Sorted without a compare function:', numberArray.sort()); 
console.log('Sorted with compareNumbers:', numberArray.sort(compareNumbers)); 

wyjściowa:

numberArray: 40,1,5,200
Sort bez funkcji porównania: 1,200,40,5
posortowana compareNumbers: 1,5,40,200

2

Używasz array#sort metoda, która porównuje wartości jako łańcuchy, a nie jako liczby. Lepszym rozwiązaniem jest użycie array.prototype.map i Math.max.apply

function largestOfFour(array) { 
    return array.map(function(arr) { 
     return Math.max.apply(Math,arr); 
    }); 
}); 

largestOfFour([[4,5,1,3],[13,27,18,26],[32,35,37,39],[1000,1001,857,1]]) 

=> [5,27,39,1001] 

Można także przekazać w funkcji do array#sort i zrobić coś takiego

array.sort(function(a,b) { return a - b }) 

Funkcja pop() usuwa i zwraca ostatni element tablicy. W tym przypadku będzie to 1001.

+1

Podczas ważnej rekomendacji ta odpowiedź nie wyjaśnia efektu, dla którego pytanie szuka przyczyny. –

2

Dolna linia: 8 jest większa niż 1.

Oto zwięzły artykuł na ten temat: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Spróbuj tego:

arr.sort(function(a, b){return a-b}).pop(); 

lub po prostu Math.max()

+0

Proszę nie odwoływać się do [* w3schools *] (http://www.w3fools.com/). [* ECMAScript 2015 *] (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-array.prototype.sort) jest ostatecznym odnośnikiem, [* MDN *] (https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) jest pomocny dla przykładów. – RobG

+0

Okay - dzięki! Teraz jestem na komórce. Naprawię to trochę. –

+0

@RobG Strona W3Fools nie wydaje się już tak krytyczna dla W3Schools: "W3Schools wciąż ma problemy, ale przynajmniej pracowali nad głównymi problemami, które mieli deweloperzy. Dla wielu początkujących W3Schools ma zorganizowane samouczki i place zabaw, które oferują przyzwoitą naukę." –

Powiązane problemy