Foros del Web » Programando para Internet » Javascript »

Array ordenar y eliminar duplicados

Estas en el tema de Array ordenar y eliminar duplicados en el foro de Javascript en Foros del Web. Buenos días Tra buscar un poco po rgoogle, he logrado hacer algunas cosillas que necesitaba pero esto se me resiste Necesito ordenar un array de ...
  #1 (permalink)  
Antiguo 11/06/2012, 04:50
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 16 años, 11 meses
Puntos: 3
Array ordenar y eliminar duplicados

Buenos días

Tra buscar un poco po rgoogle, he logrado hacer algunas cosillas que necesitaba pero esto se me resiste

Necesito ordenar un array de tal forma que no me ordene primero las mayusculas y las minusculas despues, sino que lo haga alfabéticamente independientemente de si está en minusculas o no.

Y lo otro que no he visto claro es como eliminar palabras repetidas de ese mismo array. Imagino que es más facil si ordeno primero

Un poco de luz por favor. En php es sencillo pero aquí no me manejo bien por lo que se ve
  #2 (permalink)  
Antiguo 11/06/2012, 05:10
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 16 años, 11 meses
Puntos: 3
Respuesta: Array ordenar y eliminar duplicados

Me voy respondiendo yo mismo por si se anima alguien a aclararme los conceptos

He encontrado este script que ordena como yo quiero perfectamente, pero:

1) ¿Se podría simplificar?
2) ¿Se podría aprovechar y dentro de alguno de los pasos o bucles aprovechar para ir eliminando duplicados?

Es que el código lo entiendo pero no al 100% ni como implementaría lo de los duplicados

Codigo:

// the array to be sorted
var list = ["Delta", "alpha", "CHARLIE", "bravo"];
// temporary holder of position and sort-value
var map = [];
// container for the resulting order
var result = [];

// walk original array to map values and positions
for (var i=0, length = list.length; i < length; i++) {
map.push({
// remember the index within the original array
index: i,
// evaluate the value to sort
value: list[i].toLowerCase()
});
}

// sorting the map containing the reduced values
map.sort(function(a, b) {
return a.value > b.value ? 1 : -1;
});

// copy values in right order
for (var i=0, length = map.length; i < length; i++) {
result.push(list[map[i].index]);
}

// print sorted list
print(result);

Última edición por intergus; 11/06/2012 a las 05:12 Razón: faltaba el codigo jejeje....
  #3 (permalink)  
Antiguo 11/06/2012, 07:44
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Array ordenar y eliminar duplicados

a ambas preguntas, la respuesta es sí
Cita:
var arr = ["Delta", "alpha", "CHARLIE", "bravo", "delta"];

var arr2= new Array();

min = arr.toString().toLowerCase().split(',');

for( var i = 0; i < min.length; i++) {
arr2[i] = min[i];
}



arr2.sort();


Array.prototype.EliminarRepetidos = function () {
var arr_limpio = [];
var val_eliminados = [];
var cantidad = {};
for(var i = 0; i < this.length; i++){
if(!(this[i] in cantidad)) {
cantidad[this[i]] = 0;
arr_limpio.push(this[i]);
cantidad[this[i]]++;
} else {
val_eliminados.push(this[i]);
cantidad[this[i]]++;
}
}

var repeticiones = "";
for (j=0; j < arr_limpio.length; j++) {
repeticiones +="El elemento " + arr_limpio[j] + " se repite ------ " + parseInt(cantidad[arr_limpio[j]]-1) +" veces\n"
}
alert("Arreglo Original: " + min.toString() + "\nArreglo Limpio: " + arr_limpio.toString() + "\nValores Eliminados: " + val_eliminados.toString() + "\nCantidad de veces que se repite cada elemento\n=======================\n" + repeticiones)
}


arr2.EliminarRepetidos();
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #4 (permalink)  
Antiguo 11/06/2012, 11:16
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 16 años, 11 meses
Puntos: 3
Respuesta: Array ordenar y eliminar duplicados

Gracias por la respuesta

Al principio pareció ir bien, pero cuando lo repites algunas veces y va acumulando palabras, empieza a no borrar todos los repetidos, no da ningún error, solo que los repetidos no los borra

La ordanación si que la hace siempre bien.
  #5 (permalink)  
Antiguo 11/06/2012, 13:08
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Array ordenar y eliminar duplicados

como que cuando va acumulando elementos. qué quieres decir??
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #6 (permalink)  
Antiguo 11/06/2012, 21:37
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Array ordenar y eliminar duplicados

Supongo que el tema se quedará así. Yo estaba seguro de haber hecho un "ordenador alfabético" por fuera del ASCII, pero no sé dónde anda y no me sale de nuevo. El problema de

Cita:
Iniciado por intergus
Necesito ordenar un array de tal forma que no me ordene primero las mayusculas y las minusculas despues, sino que lo haga alfabéticamente independientemente de si está en minusculas o no.
Es que se podría interpretar como que se pasa todo a minúsculas, y se ordena. Pero también puede que se refiera justamente al orden del ASCII, que primero tiene el alfabeto en mayúsculas y después en minúsculas. Por no hablar de caracteres como la "Ñ", que está fuera de orden para el español.

Entonces el punto es ¿y cómo lo ordenamos?.

¿0123456789AaBbCcDd...WwXxYyZz?
¿Y con las vocales acentuadas, qué hacemos?


Bien, en realidad no era esto lo que quería comentar. De última se pone todo en minúscula y se ve el asunto más tarde.

······································


¿Soy un inútil, o no hay una forma de hacer un replace() que funcione en elementos de array y no sólo en sub-cadenas?

Esto es una chanchada, pero me emperré en usar replace(), así que me la pasé cambiando entre array y string para contar y reemplazar, en la eliminación de duplicados.

Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<script type="text/javascript">
var cadena = ["Delta", "alpha", "CHARLIE", "bravo", "delta", "delta", "AlPhA"]; 

function ordena(){
var minusculizado = cadena.toString().toLowerCase(); alert(minusculizado)
var ordenado = minusculizado.split(",").sort(); alert(ordenado)
var desduplicado = [];

while(ordenado != ""){
var cadaPalabra = ordenado.shift(); alert(cadaPalabra+" ·· "+ordenado)
var cadaPalabraConComa = cadaPalabra + ","; alert(cadaPalabraConComa)
var expresionregular = new RegExp(cadaPalabraConComa,"g"); alert(expresionregular)
ordenado = ordenado.toString() + ","; alert(ordenado+" ordenado.toString")
ordenado = ordenado.replace(expresionregular,""); alert(ordenado+" ordenado.replace")
desduplicado.push(cadaPalabra); alert(desduplicado+" desduplicado")
ordenado = ordenado.split(","); alert(ordenado+" ordenado.split")
ordenado.pop(); alert(ordenado+" ordenado.pop")
}

prompt("",desduplicado)
}

onload = ordena;
</script>
</head>
<body></body>
</html>
Al menos no usé un length para limitar un for.

Y tampoco comenté las alertas. Si quieren las sacan antes de probar.

Por supuesto, tienen todo el derecho del mundo a mencionar esa coma intermitente.


(¡dioses!, lo posteo antes de que me arrepienta...)
  #7 (permalink)  
Antiguo 12/06/2012, 08:42
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Array ordenar y eliminar duplicados

la ñ y los caracteres acentuados son un problema. no importar en que los conviertas (dec, hex, entidades, ...) a ver si encuentras el código

no eres un inútil, es que el método replace() sólo puedes usarlo con los objetos string. el objeto array no posee dicho método
Cita:
Iniciado por furoya Ver Mensaje
Al menos no usé un length para limitar un for.
en su lugar usastes un ciclo while y el método shift() pero según la lógica, no te quedaba otra opción mas que esa
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #8 (permalink)  
Antiguo 12/06/2012, 21:44
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Array ordenar y eliminar duplicados

Cita:
Iniciado por IsaBelM
Si me dabas 15 minutos más inventaba algo peor.

No sé si era la única opción. Pero en verdad no quería andar contando bucles. Ese modo me pareció más rápido, y después se me ocurrió probar un for in, que se acerca más a la eficiencia del recorrido que hace un replace().

De más está decir que mi ejemplo tiene un error (al menos) que sale de buscar por cadenas sin delimitar, o delimitadas a medias. Para encontrar las palabras es indispensable marcar el comienzo y el fin. Yo solamente marqué el fin, con una coma; pero me faltó el comienzo.
Por eso si a la var cadena le agregamos deltadelta ... al final no la encuentra.
El tuyo sí.


Sabía que "oficialmente" el replace() era para string. Me siento un inútil porque no se me ocurrió nada para adaptarlo. Pero si no pudo la gente que sabe más que yo ¿a qué perder el tiempo?


Lo de ordenar según el alfabeto español lo había encontrado. No los originales, pero sí las versiones sobre sugerencia de caricatos. Están en este Foro

Manipular array #20

El problema no es tanto técnico, como ligüístico. Hay que hacer un orden para los caracteres, que incluya a todos los alfabetizables.
¿En qué lugar metemos letras como "ª" u "º"?

Nunca supe por qué abandonamos el proyecto del spanishSort. Supongo que en esa época teníamos demasiadas cosas por inventar.
  #9 (permalink)  
Antiguo 13/06/2012, 03:34
 
Fecha de Ingreso: junio-2012
Mensajes: 25
Antigüedad: 11 años, 10 meses
Puntos: 2
Respuesta: Array ordenar y eliminar duplicados

buenos dias, para lo de que te lo ordene mayusculas y minusculas independientemente, es decir que A sea lo mismo que a podrias almacenar en una variable el valor ascii de la pocicion que estas ahora y si es mayor a 90 le restas 32 (es como transformarlo en mayusculas) y comparas con el valor ascci de la pocision anterior que si es mayor a 90 la misma historia haces las comparaciones con esas variables y dependiendo el resultado guardas el array en la pocision donde estaba la deseada, eso no te resuelve el ordenamiento, pero creo que te simplificaria bastante el proceso, por que antes lo volvias todo minusculas si no me equivoco, ademas que aqui se te guardarian Ab en el ejemplo que pusiste antes creo que se guardaria ab que no es lo mismo, igual tal vez eso no es lo que querias, pero lo digo por si si
  #10 (permalink)  
Antiguo 13/06/2012, 07:14
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Array ordenar y eliminar duplicados

Sí. Fue una buena idea igualar las distancias entre las versiones mayorcitas y menorcitas del alfabeto latino. Pero en otros no coincide. De hecho, entre los mismos caracteres latinos que están en otros bloques las distancias son diferentes.

En Alfanuméricos Matemáticos, la "A" mayúscula en negrita dista 26 caracteres de la minúscula, lo mismo entre las Itálicas, las Góticas y las Cursivas.

En vocales alteradas, la "A" con macrón está a sólo 1 caracter de la "ā".

En Griego y Cirílico (propiamente dicho) también se mantiene la diferencia de 32, hasta que nos metemos con sus grafías arcáicas, y las "sampi" o "digama" helenas (may. y min.) están una al lado de la otra. El alfabeto Glagólico tiene 40 letras, ni em pu …jando todos vamos a darle una distancia de 32 caracteres entre versales y versalitas.
Digo, por si queremos extender el ordenamiento, y no solamente mirar nuestro ombligo hispanoparlante.

La idea no es mala, Watafoc, pero nos va a alcanzar para crear la cadena de referencia sin tener que escribirla y no para hacer la comparación mientras ordenamos. Es más, el escript con todas las "excepciones" puede resultar más largo que la misma cadena .

Bueno, el tema se fue para otro lado. Quizá abramos uno nuevo para seguir con el orden alfabético. O no, porque ya alguien lo debe haber resuelto en alguna parte. Desde que abandonamos aquel viejo proyecto aquí, supongo que en otros sitios y después de tantos años ya debe estar hecho. La verdad es que nunca busqué.
  #11 (permalink)  
Antiguo 13/06/2012, 08:28
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Array ordenar y eliminar duplicados

No entendí bien, pero vamos a ver:

Código Javascript:
Ver original
  1. var list = ['Perro', 'Perro', 'Gato', 'perrito', 'gatito', 'gatito'];
  2.  
  3. var anotherList = list
  4.     .reduce(function(memo, current) {
  5.         if(memo.indexOf(current) === -1) {
  6.             memo.push(current);
  7.         }
  8.         return memo;
  9.     }, [])
  10.     .sort(function(one, another) {
  11.         return one.toLowerCase() >
  12.             another.toLowerCase() ?
  13.             1 : -1;
  14.     });
  15.    
  16.    
  17. anotherList; // ["gatito", "Gato", "perrito", "Perro"]

PD: Hacer eso que hice en PHP es mucho más díficil.
__________________
blog | @aijoona
  #12 (permalink)  
Antiguo 13/06/2012, 09:58
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Array ordenar y eliminar duplicados

¿Y hacerlo en IE?

¿O indexOf ya funciona?

Si fuese compatible nos resuelve un problemón. Yo ni lo probé.
Cuando consiga una versión medianamente actualizada del navegador de MS lo veo.
  #13 (permalink)  
Antiguo 13/06/2012, 10:40
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Array ordenar y eliminar duplicados

Hola:

Con la idea de decidir con código el orden del abecedario (me refiero al sort), tengo esta función:

Código:
function sortexto(a, b) {
	aaa = a.charAt(0).toLowerCase();
	bbb = b.charAt(0).toLowerCase();
	abc = "aábcdeéfghiíjklmnñoópqrstuúvwxyz";
	if (abc.indexOf(aaa) == abc.indexOf(bbb))
		return sortexto(a.substr(1), b.substr(1))
	else
		return (abc.indexOf(aaa) - abc.indexOf(bbb)); 
}
Y se aplica como parámetro del sort...

el_array.sort(sortexto);

Lo apliqué en esta página: Mapa de España.

Los duplicados supongo que se deberían buscar luego...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo

Última edición por caricatos; 13/06/2012 a las 10:41 Razón: sintaxis
  #14 (permalink)  
Antiguo 13/06/2012, 11:37
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Array ordenar y eliminar duplicados

Cita:
Iniciado por furoya Ver Mensaje
¿Y hacerlo en IE?

¿O indexOf ya funciona?

Si fuese compatible nos resuelve un problemón. Yo ni lo probé.
Cuando consiga una versión medianamente actualizada del navegador de MS lo veo.
Podes usar polyfills o alguna lib como Underscore.

@caricatos

Tu código leakea algunas variables al contexto global
__________________
blog | @aijoona
  #15 (permalink)  
Antiguo 13/06/2012, 12:27
Avatar de intergus  
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 16 años, 11 meses
Puntos: 3
Respuesta: Array ordenar y eliminar duplicados

Madre mía la que he liado....

Bueno, habeis profundizado a niveles en los que ni pensaba.

La idea de ordenación era porque me di cuenta de que el sort ordenaba así:

Amigo Cola abad bebe

Y lógicamente, al menos quería que lo hiciese así:
Amigo abad bebe Cola

Además era imprescindible que el array resultante mantuviese sus características originales, lo que estaba en mayúsculas o minúsculas, que siguiese así.

Para ello he encontrado una solución que no se si la más acertada, pero funciona bien, al menos lo que he probado

Básicamente lo ordena en estos pasos:
1) mapea la posición del array original
2) convierte a minusculas para igualar todo y ordena siendo todo minusculas y una vez obtenido el orden correcto de los indices con el todominusculas, monta o recompone un nuevo array con los valores del original, siguiendo el orden obtenido cuando ordenó las minusculas. Bueno creo que se ve lo que hace en el código.

function ordenAlfa(arr){
var map = []; // array temporal de posición y valor
var result = []; // array final con el resultado ya ordenado
// recorre array original pasándo al array map el valor y posición de cada elemento
for (var i=0, length = arr.length; i < length; i++) {
map.push({
// recuerda la posición en el array original
index: i,
// evalua el valor a ordenar
value: arr[i].toLowerCase()
});
}
// ordenando el array map que contiene los valores en minusculas
map.sort(function(a, b) {
return a.value > b.value ? 1 : -1;
});
// copia los valores ya ordenados al array resultado, usando la posición ordenada
// pero usando el valor del array original
for (var i=0, length = map.length; i < length; i++) {
result.push(arr[map[i].index]);
}
return result;
}

Una vez aquí ya tengo un array ordenado y elimino los duplicados con esta función, pasandole el array ya ordenado

function array_unique(arU){
if (arU.length>1){
var arrUnique=new Array(arU[0]);
for (i=1;i<arU.length;i++){
if(arU[i]!=arrUnique[arrUnique.length-1]){
arrUnique.push(arU[i]);
}
}
return arrUnique;
}else{
return arU;
}
}

Puede que no esté perfecto y seguro que sometido a algún array concreto o más especial, es posible que falle, pero para lo que yo lo requería, de momento, va de lujo.

Gracias a todos, y si se puede simplificar sin perder funcionalidad, pues mejor aún.
  #16 (permalink)  
Antiguo 13/06/2012, 13:49
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Array ordenar y eliminar duplicados

Cita:
Iniciado por caricatos Ver Mensaje
Con la idea de decidir con código el orden del abecedario (me refiero al sort), tengo esta función:...
Alguien lo tenía que hacer. ¿por qué no me extraña que seas tú?

Cita:
Iniciado por Aijoona Ver Mensaje
Podes usar polyfills o alguna lib como Underscore.
No, no puedo. Si tengo que usar una lib, la escribo yo.
¿Entonces todavía no funciona? En realidad es lo que corresponde, pero alguna vez MS podría no ser tan estricto con las reglas, y hacer las cosas mal como otros navegadores. Para nosotros es una ayuda.

Cita:
Iniciado por Aijoona Ver Mensaje
@caricatos

Tu código leakea algunas variables al contexto global
Perdón por ser tan bruto, ¿qué es "leakear"?

Cita:
Iniciado por intergus Ver Mensaje
Madre mía la que he liado....
No te preocupes. Siempre elegimos alguna víctima para destruirle el tema

Es un buen método el de asociar el orden de los arrays, creo que en el enlace que puse hay algo también sobre eso. O si no, está en otro. Pero algún otro ejemplo hay.

Un inconveniente de capitalizar (o minusculizar) cadenas antes de aplicar un sort() es que si existe una misma palabra como "Tierra" y "tierra", al ordenarlas van a quedar según la posición en el texto, porque el escript ignora cuál es la que está en mayúscula.


Y no te puedes quejar. Tienes bastante código para entretenerte.
  #17 (permalink)  
Antiguo 13/06/2012, 14:08
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Array ordenar y eliminar duplicados

Cita:
Iniciado por furoya Ver Mensaje
A
No, no puedo. Si tengo que usar una lib, la escribo yo.
¿Entonces todavía no funciona? En realidad es lo que corresponde, pero alguna vez MS podría no ser tan estricto con las reglas, y hacer las cosas mal como otros navegadores. Para nosotros es una ayuda.
Bueno, si te parece que lo querés hacer vos, te digo que implementar los polyfills para Array#indexOf y Array#reduce es trivial, con lo cual sigue siendo aplicable.

Funcionar funciona, tal como lo define EcmaScript 262 en su versión 5, que es la versión actual, no un draft ni mucho menos sino la versión cánonica de JavaScript hoy por hoy.
Así que lo que "corresponde" es que funcione, si querés dar versiones para plataformas obsoletas es otro cantar (que es donde entran los polyfills/libs).

Microsoft no hace las cosas mal, las hace horriblemente mal en cuanto a implementación de especificaciones.
__________________
blog | @aijoona
  #18 (permalink)  
Antiguo 13/06/2012, 15:25
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Array ordenar y eliminar duplicados

Cita:
Iniciado por intergus Ver Mensaje

Puede que no esté perfecto y seguro que sometido a algún array concreto o más especial, es posible que falle, pero para lo que yo lo requería, de momento, va de lujo.

Gracias a todos, y si se puede simplificar sin perder funcionalidad, pues mejor aún.
si no quieres eliminar aquellos elementos que están repetidos porque están escritos en mayúscula y minúscula, entonces

Cita:
var arr = ["Delta", "alpha", "CHARLIE", "bravo", "delta", "delta", "AlPhA"];


arr.sort(function(a,b) {return a.toLowerCase() > b.toLowerCase() ? 1 : -1; });


Array.prototype.EliminarRepetidos = function () {
var arr_limpio = [];
var cantidad = {};
for(var i = 0; i < this.length; i++){
if(!(this[i] in cantidad)) {
cantidad[this[i]] = 0;
arr_limpio.push(this[i]);
cantidad[this[i]]++;
}
}



console.log(arr_limpio)
}


arr.EliminarRepetidos();
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}

Última edición por IsaBelM; 13/06/2012 a las 16:18 Razón: quitar una pd
  #19 (permalink)  
Antiguo 13/06/2012, 22:07
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Array ordenar y eliminar duplicados

Cita:
Iniciado por Aijoona Ver Mensaje
Bueno, si te parece que lo querés hacer vos, te digo que implementar los polyfills para Array#indexOf y Array#reduce es trivial, con lo cual sigue siendo aplicable.

Funcionar funciona, tal como lo define EcmaScript 262 en su versión 5, que es la versión actual, no un draft ni mucho menos sino la versión cánonica de JavaScript hoy por hoy.
Así que lo que "corresponde" es que funcione, si querés dar versiones para plataformas obsoletas es otro cantar (que es donde entran los polyfills/libs).

Microsoft no hace las cosas mal, las hace horriblemente mal en cuanto a implementación de especificaciones.
No es que "lo quiera hacer". Es que lo tengo que hacer. Por supuesto que recorrer todos los elementos es sencillo, y es lo que hacen esas librerías. El punto es no tener que hacerlo, porque lo hayan previsto en el lenguaje.

Entonces quedamos en que indexOF sí trabaja para array en IE. Te voy a creer, así no lo tengo que probar.
Igual que lo del EcmaScript 262 en su versión 5. Estaba seguro de que alguna vez sí lo busqué, y decía que era para string. Como el replace, que mencionamos más arriba. Hagamos fuerza para que en la versión 6 metan uno que sirva en elementos de arrays.

Con respecto al otro cantar, si quiero dar versiones para plataformas obsoletas a algún cliente que me lo exija, voy a meterle esos polyfills. Si lo tengo que recomendar en un foro de programadores, se me caería la cara de vergüenza.

Por otro lado, si vamos a hablar en serio del comportamiento de MS, tampoco te lo pienso discutir.


Cita:
Iniciado por IsaBelM Ver Mensaje
si no quieres eliminar aquellos elementos que están repetidos porque están escritos en mayúscula y minúscula, entonces ...
Otra vuelta de tuerca del ejemplo de Aijoona



(No hay caso, voy a tener que ponerme a estudiar javascript).
  #20 (permalink)  
Antiguo 14/06/2012, 05:50
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Array ordenar y eliminar duplicados

Cita:
Iniciado por furoya Ver Mensaje
Otra vuelta de tuerca del ejemplo de Aijoona
no tiene importancia, pero no es así.
de inicio no use reduce() ni indexOf() porque creo que cuanto menos hay que dar cobertura a ie8. con respecto a usar la función comparativa en sort(), no lo hice de inicio porque pensé que intergus quería eliminar los elementos repetidos independientemente que estuvieran en mayúscula o minúscula
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #21 (permalink)  
Antiguo 14/06/2012, 07:34
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Array ordenar y eliminar duplicados

Cita:
Iniciado por furoya Ver Mensaje
Entonces quedamos en que indexOF sí trabaja para array en IE. Te voy a creer
No tenes que creerme a mí (de hecho no afirme que IE soporte indexOf o no), sino que tenes que buscar en alguna de las tantas referencias serias que hay en la web, ejemplo:

http://kangax.github.com/es5-compat-table/

Array#indexOf: IE9+
Array#reduce: IE9+

Cita:
Iniciado por furoya Ver Mensaje
Con respecto al otro cantar, si quiero dar versiones para plataformas obsoletas a algún cliente que me lo exija, voy a meterle esos polyfills. Si lo tengo que recomendar en un foro de programadores, se me caería la cara de vergüenza.
Por qué se te caería la cara de vergüenza? Este es un foro de JavaScript, y la referencia que doy es la que se corresponde con la versión actual del lenguaje. Desgraciadamente los polyfills son la única alternativa cuando hablamos de plataformas obsoletas o con implementación parcial (por no decir plataformas de mierda).

Peroooooo, volviendo al tópico, el objeto Array es super maleable con los métodos map y reduce. Implementar un replace es tán básico como mapear con una lógica dada, o mismo, como ya ejemplifique, implementar un Array#unique es super trivial.

Les recomiendo estudiar ambos métodos, van a descubrir que simplifican muchas tareas usuales.
__________________
blog | @aijoona
  #22 (permalink)  
Antiguo 14/06/2012, 08:19
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Array ordenar y eliminar duplicados

Cita:
Iniciado por IsaBelM Ver Mensaje
no tiene importancia, pero no es así.
de inicio no use reduce() ni indexOf() porque creo que cuanto menos hay que dar cobertura a ie8. con respecto a usar la función comparativa en sort(), no lo hice de inicio porque pensé que intergus quería eliminar los elementos repetidos independientemente que estuvieran en mayúscula o minúscula
Justamente. Lo dije por la función comparativa. Está muy bien mostrar distintas versiones de un modo para hacer las cosas.

Gracias por el enlace. Muy revelador.



(Ya que no estoy aportando nada al tema, pero sigo posteando, aprovecho para estrenar un estilo de respuesta citada que vi en algunos post. No me convencía demasiado, pero en esta vida hay que probarlo todo. Y lo hago porque aún no me echaron de aquí)


Cita:
Iniciado por Aijoona Ver Mensaje
No tenes que creerme a mí (de hecho no afirme que IE soporte indexOf o no), sino que tenes que buscar en alguna de las tantas referencias serias que hay en la web, ejemplo:

http://kangax.github.com/es5-compat-table/

Array#indexOf: IE9+
Array#reduce: IE9+


Bueno, voy a creerte que ese "kangax" es una referencia seria.


Por qué se te caería la cara de vergüenza? Este es un foro de JavaScript, y la referencia que doy es la que se corresponde con la versión actual del lenguaje. Desgraciadamente los polyfills son la única alternativa cuando hablamos de plataformas obsoletas o con implementación parcial (por no decir plataformas de mierda).

No son la única. Se puede escribir el parche en el código y no depender de inventos ajenos. Que la mayoría de los que no son programadores —y por lo tanto no deberían usarlos— creen que son 'mágicos' y 'arreglan' el JS, CSS o HTML con métodos que no pueden (cuando en realidad deben) entender.
¿Así que es oficial desde 2010? Claro, no hay que usar indexOf en array porque en plataformas que tienen de más de un año de liberadas puede que no anden.



Peroooooo, volviendo al tópico, el objeto Array es super maleable con los métodos map y reduce. Implementar un replace es tán básico como mapear con una lógica dada, o mismo, como ya ejemplifique, implementar un Array#unique es super trivial.


Por eso digo que soy un inútil. Lamentando contradecir a IsaBelM sin ser su amigo. Menos, su pariente. [NOTA: chiste para dos]



Les recomiendo estudiar ambos métodos, van a descubrir que simplifican muchas tareas usuales.

¡Seguro!. No tengo la menor duda.

(Mmmm. No queda tan mal. Le falta un golpe de horno, pero lo voy a seguir usando.)
  #23 (permalink)  
Antiguo 14/06/2012, 08:41
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Array ordenar y eliminar duplicados

Cita:
Bueno, voy a creerte que ese "kangax" es una referencia seria.
Ese "kangax" es una eminencia en lo que respecta al tema JavaScript y DOM, pero de cualquier manera, la tabla de compatibilidad no está dada por una opinión sino por tests (que dicho sea de paso, verifican la existencia y no la conformidad con el estándar).

Cita:
No son la única. Se puede escribir el parche en el código y no depender de inventos ajenos. Que la mayoría de los que no son programadores —y por lo tanto no deberían usarlos— creen que son 'mágicos' y 'arreglan' el JS, CSS o HTML con métodos que no pueden (cuando en realidad deben) entender.
Escribir el parche en el código lo puedo entender de dos maneras, la primera es que al no usar las construcciones que deberías (en este caso Array#reduce) tenés una implementación más extensa, error-prone y fuera del spec.
La segunda es que vos implementás el polyfill, lo cual me parece que es casi lo mismo que usar un polyfill externo, con la desventaja de que perdés la robustez y testing que pueda tener.

Por lo general los "inventos ajenos" suelen ser realizados por gente que la tiene atada, solo es cuestión de búscar y tener criterio a la hora de utilizar.

Cita:
¿Así que es oficial desde 2010? Claro, no hay que usar indexOf en array porque en plataformas que tienen de más de un año de liberadas puede que no anden.
Acá estás confundiendo los tantos, que pase de draft a definitiva poco cambia el asunto, ya que es un proceso excesivamente lento y burocratico.

Pero básicamente, la especificación es anterior al 2010.
__________________
blog | @aijoona

Etiquetas: duplicados, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:10.