Ver Mensaje Individual
  #20 (permalink)  
Antiguo 15/12/2013, 11:29
Avatar de Aijoona
Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Propuesta para desafíos javascript 2014

Cita:
Iniciado por Panino5001 Ver Mensaje
A ver si entendí bien:
Código PHP:
<script>
function 
tercero(arr){
    return 
arr.sort().filter(function(el,i,ar){if(i==ar.indexOf(el))return 1;return 0})[2] || false;
}
</script> 
El problema de sort es que es lexicografico por defecto, entonces [1, 2, 10] -> [1, 10, 2]. Por este motivo es necesario pasarle el callback.

Mi solución, bastante similar, aunque use reduce en lugar de filter:

Código Javascript:
Ver original
  1. function getMin(arr, pos) {
  2.     pos = pos || 0;
  3.     return arr
  4.             .reduce(function(m, c) {
  5.                 if(m.indexOf(c) == -1) m.push(c);
  6.                 return m;
  7.             }, [])
  8.             .sort(function(a, b) {
  9.                 return a > b ? 1 : -1;
  10.             })[pos] || false;
  11. }
  12.  
  13. var tercero = function(arr) { return getMin(arr, 2) };
  14.  
  15. function assertEquals(a, b) {
  16.     if(a !== b) console.error(
  17.         'Expected: ' + a + '. Got: ' + b
  18.     );
  19. }
  20.  
  21. assertEquals(tercero([]), false);
  22. assertEquals(tercero([1]), false);
  23. assertEquals(tercero([1, 2]), false);
  24. assertEquals(tercero([1, 2, 3]), 3);
  25. assertEquals(tercero([1, 2, 2]), false);
  26. assertEquals(tercero([2, 2, 2, 2, 2]), false);
  27. assertEquals(tercero([1, 2, 2, -3]), 2);
  28. assertEquals(tercero([1, 2, 2, -3, -3]), 2);
  29. assertEquals(tercero([1, 2, 2, -3, -11]), 1);
  30. assertEquals(tercero([1, 2, 2, -3, -Infinity]), 1);
  31. assertEquals(tercero([1, 2, 2, -3, -Infinity]), 1);
__________________
blog | @aijoona