2014-09-28 12 views
5

Tylko kwestia ciekawości. Dzięki funkcji redukcji możemy łatwo znaleźć najmniejszą i największą liczbę w tablicy osobno. Po prostu tak:Znajdź najmniejszą i największą liczbę tablic z funkcją zmniejszenia w javascript

var a = [1,2,3,4,5,1,-1,6,7,8,9,10,2,11]; 
a.reduce(function(prev,cur,index,array){ 
    return prev > cur ? prev : cur; 
}); // returns 11 

a.reduce(function(prev,cur,index,array){ 
    return prev < cur ? prev : cur; 
}); // returns -1 

Biorąc to pod uwagę, dlaczego to nie działa?

var a = [1,2,3,4,5,1,-1,6,7,8,9,10,2,11]; 
var smallest = 0; 
var biggest = 0; 
a.reduce(function(prev,cur,index,array){ 
    smallest = prev < cur ? prev : cur; 
    biggest = prev > cur ? prev : cur; 
}); 
console.log([smallest, biggest]); // prints [11,11] 

Testowane na repl.it. Z góry dziękuję.

Odpowiedz

4

w następujących przypadkach:

a.reduce(function(prev,cur,index,array){ 
    smallest = prev < cur ? prev : cur; 
    biggest = prev > cur ? prev : cur; 
}); 

funkcja dostarczana do zmniejszyć ma return więc zwraca niezdefiniowanej. Tak więc po pierwszej iteracji jest ustawiony na niezdefiniowany.

Jeśli któryś wyraz w abstract relational comparison algorithm jest niezdefiniowana, wyrażenie zwraca niezdefiniowany (patrz krok 3.c), rozpoznawaną fałszywego. Tak więc począwszy od drugiej iteracji, zarówno najmniejszy i największy są ustawione na cur i na końcu oba są ustawione na ostatnią wartość w tablicy.

+0

Dziękuję za odpowiedź. Kiedy dodałem instrukcję return z "najmniejszą" zmienną, wszystko działało. Chociaż odpowiedź @zerkms działała jak czar (testowałem, i chciałem go również przegłosować, ale został usunięty, zanim mogłem to zrobić), wskazałeś mi właściwy problem. –

2

Dwa problemy.

Po pierwsze, parametr lambda do reduce nie ma wartości zwracanej. Jeśli nie zamierzasz czegoś zwrócić, reduce jest po prostu forEach z większą liczbą parametrów, które nic nie znaczą.

Po drugie, w każdym elemencie, jeśli porównać cur do prev zamiast porównując cur do biggest i smallest.

0

wiem, że to starożytny, ale tutaj jest jak rozwiązać takie problemy z wykorzystaniem tablicy zmniejszają:

var a = [1,2,3,4,5,1,-1,6,7,8,9,10,2,11]; 

var minNumber = a.reduce(function(prev,cur) { 
    return prev < cur ? prev : cur; 
}, +Infinity); 

var maxNumber = a.reduce(function(prev,cur) { 
    return prev > cur ? prev : cur; 
}, -Infinity); 
+0

maxNumber powinien być zainicjalizowany przez '-Infinity' zamiast – marmor

+0

@marmor masz rację, poprawiłem go, naprawiłem teraz – Bamieh

Powiązane problemy