He creado un array de objetos como:
var places = [];
var a = {};
a.lat = 12.123;
a.lng = 13.213;
a.city = "New York";
places.push(a);
var b = {};
b.lat = 3.123;
b.lng = 2.213;
b.city = "New York";
places.push(b);
...
Estoy tratando de crear una nueva matriz en la que los filtros de los lugares a los que sólo contiene objetos que no tienen la misma propiedad de la ciudad (lat/lng duplicados están bien). Hay una construida en JS o Jquery función de lograr esto?
- Sí, mira en [].forEach() o el bucle for.
- Se ve personalizado. ¿Cómo se puede determinar cuál debe ser descartada? a o b? Escribir una función personalizada para introducir esta lógica.
- En primer lugar, ordenar la matriz por el nombre de la ciudad, luego iterar a través de ellos uno por uno eliminación de duplicados como puedo encontrarlos. Si usted no ordenar en primer lugar, tendrás que recorrer toda la matriz para cada entrada de la matriz.
- Me gustaría utilizar los nombres de las ciudades como las propiedades de un objeto.
- Un ‘set’ puede ayudarle a: stackoverflow.com/questions/7958292/…
Me gustaría probable que el uso de las banderas objeto durante el filtrado, como este:
Que utiliza
Array#filtro
de ECMAScript5 (ES5), que es uno de los ES5 adiciones que puede ser acuñada (de la búsqueda para «es5 calza» para varias opciones).Se puede hacer sin
filter
, por supuesto, es sólo un poco más detallado:Tanto de los anteriores asumen que el primera objeto con una determinada ciudad debe ser mantenido, y todos los demás se descartan.
Nota: Como user2736012 señala a continuación, mi prueba
if (flags[entry.city])
será cierto para las ciudades con nombres que pasan a ser las mismas que las propiedades que existen enObject.prototype
comotoString
. Muy raro en este caso, pero hay cuatro maneras de evitar la posibilidad de:(Mi costumbre solución preferida) Crear el objeto sin un prototipo:
var flags = Object.create(null);
. Esta es una característica de ES5. Tenga en cuenta que esto no puede ser acuñada para navegadores obsoletos como IE8 (el único argumento de la versión deObject.create
puede ser excepto cuando ese argumento de que el valor denull
).Uso
hasOwnProperty
para la prueba, por ejemplo,if (flags.hasOwnProperty(entry.city))
Poner un prefijo que usted sabe que no existe para cualquier
Object.prototype
de la propiedad, tales comoxx
:Como de ES2015, usted podría usar un
Set
lugar:Object.prototype
propiedad, todavía no es una mala idea utilizar.hasOwnProperty()
para esto.constructor
de la propiedad, por ejemplo. Él/ella hizo un muy buen punto.Menor
, pero no mejor rendimiento(vea la actualización de abajo) solución para es6 :rendimiento: https://jsperf.com/compare-unique-array-by-property
https://lodash.com/docs#uniqBy
https://github.com/lodash/lodash/blob/4.13.1/lodash.js#L7711
He ampliado un poco en @IgorL solución, sino que se extendió prototipo y le dio un selector de función en lugar de una propiedad para que sea un poco más flexible:
Uso:
Definitivamente NO es la más eficiente manera de hacer esto, pero siempre que el selector es simple y la matriz no es masivo, se debe trabajar muy bien.
En El Manuscrito
Mi sugerencia :
de uso :
o
Con el anterior, puede ordenar la matriz por cualquiera de los campos en los objetos, incluso si no están presentes para algunos de los objetos.
o
prototype
acaba de agregar esa función específica..prototype
método. No es un problema técnico, más conceptual, que es subjetivo.prototype.unique
y añadir un poco de apoyo a decir para especificar la clave comofunction(key) { ... }
, entonces creo que estaría bien, pero esto me parece poco tonto para mí.Podría usar un Mapa para las entradas con la misma llave de la propiedad (en el caso de ‘la ciudad’) sólo aparecen una vez
Más información sobre el Mapa y los objetos de la matriz aquí
Ejemplo básico en Codepen
Como se señaló en los comentarios, se podría utilizar un objeto como un mapa, el cual le permitirá evitar duplicados, puede, a continuación, enumerar las propiedades del objeto.
de trabajo violín: http://jsfiddle.net/gPRPQ/1/
Otra opción:
Puedes pegarlo en tu consola para ver su funcionamiento.
Se debe trabajar para el escenario presentado y algunos otros.
Simples
Javascript
código para eliminar duplicados en las ciudades deplaces
lista de matriz esEste hilo puede ser viejo, pero pensé que debía compartirlo. Está basado en JavaScript Puro y elimina los Duplicados de los Objetos basándose en las Propiedades Especificadas.
Puede ver el violín aquí