Digamos que tengo un objeto:
{
item1: { key: 'sdfd', value:'sdfd' },
item2: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
Quiero crear otro objeto filtrando el objeto de arriba, así que tengo algo así.
{
item1: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
Estoy buscando una manera limpia de lograr esto usando Es6, por lo que los operadores de propagación están disponibles para mí.
filter
ecmascript-6
29er
fuente
fuente

Respuestas:
Si tiene una lista de valores permitidos, puede retenerlos fácilmente en un objeto usando:
Esto usa:
Object.keyspara enumerar todas las propiedades enraw(los datos originales), luegoArray.prototype.filterpara seleccionar claves que están presentes en la lista permitida, usandoArray.prototype.includespara asegurarse de que estén presentesArray.prototype.reducepara construir un nuevo objeto con solo las propiedades permitidas.Esto hará una copia superficial con las propiedades permitidas (pero no copiará las propiedades en sí).
También puede usar el operador de propagación de objetos para crear una serie de objetos sin mutarlos (gracias a rjerue por mencionar esto ):
Para fines de trivia, si desea eliminar los campos no deseados de los datos originales (lo que no recomendaría hacer, ya que implica algunas mutaciones feas), podría invertir el
includescheque de la siguiente manera:Incluyo este ejemplo para mostrar una solución basada en la mutación, pero no sugiero usarla.
fuente
Array.prototype.includesno es parte de ES6. Se introdujo en ECMAScript 2016 (ES7).Si está de acuerdo con el uso de la sintaxis ES6, creo que la forma más limpia de hacerlo, como se señala aquí y aquí, es:
Ahora
newDatacontiene:O, si tiene la clave almacenada como una cadena:
En este último caso,
[key]se convierte enitem2pero dado que está utilizando unaconstasignación, debe especificar un nombre para la asignación._representa un valor de descarte.Más generalmente:
Esto no solo reduce su operación a una sola línea, sino que tampoco requiere que sepa cuáles son las otras claves (las que desea conservar).
fuente
_representa un valor de descarte" ¿de dónde viene esto? Primera vez que lo veo_es simplemente un nombre de variable válido que se puede usar en JS, pero dado que prácticamente no tiene nombre, realmente no se debe usar de esa manera si te importa transmitir intenciones. Por lo tanto, se ha adoptado como una forma de denotar una variable que no le importa. Aquí hay más discusión al respecto: stackoverflow.com/questions/11406823/…filteryreduce._no importa, es solo un nombre de variable, puedes cambiarle el nombre a lo que quierasomitfunción de lodash : lodash.com/docs/4.17.10#omit o una de las otras soluciones dadas aquí.La forma más limpia que puedes encontrar es con Lodash # pick
fuente
Nada que no se haya dicho antes, pero para combinar algunas respuestas a una respuesta general de ES6:
fuente
Solo otra solución en una línea de Modern JS sin bibliotecas externas .
Estaba jugando con la función " Destructuring ":
fuente
var myNewRaw = (({ item1, item3}) => ({ item1, item3 }))(raw);Ahora puede hacerlo más corto y simple utilizando el método Object.fromEntries (consulte el soporte del navegador):
Leer más sobre: Object.fromEntries
fuente
Puede agregar un genérico
ofilter(implementado con genéricooreduce) para que pueda filtrar fácilmente los objetos de la misma manera que los arreglos:Podemos verlo trabajando aquí.
Verifique los resultados en su propio navegador a continuación:
Mostrar fragmento de código
Estas dos funciones podrían implementarse de muchas maneras. Elegí unirme a
Array.prototype.reduceinterior,oreducepero podrías escribirlo fácilmente desde cerofuente
oreduce, el primeroaccestá sombreado.reduce(acc, k), y enofiltereloestá sombreado,oreducese llama con una variable llamadaotambién, ¿cuál es cuál?ofilterla variableoestá sombreada pero siempre apunta a la misma entrada var; es por eso que está sombreado aquí, porque es lo mismo: el acumulador (acc) también está sombreado porque muestra más claramente cómo se mueven los datos a través de la lambda;accno siempre es el mismo enlace , pero siempre representa el estado actual persistente del resultado computacional que deseamos devolverAsí es como lo hice recientemente:
fuente
Object.assign == ...Podrías escribirconst dummyObj = { ...obj }yconst target = { ...dummyObj }. Además, esto último no es del todo necesario, ya que podría trabajar directamente con dummyObj después.ok, ¿qué tal este one-liner
fuente
Las respuestas aquí son definitivamente adecuadas, pero son un poco lentas porque requieren recorrer la lista blanca para cada propiedad del objeto. La solución a continuación es mucho más rápida para grandes conjuntos de datos porque solo recorre la lista blanca una vez:
fuente
Piggybacking en la respuesta de ssube .
Aquí hay una versión reutilizable.
Para llamarlo use
Lo bueno de las funciones de flecha de ES6 es que no tiene que pasar
allowedcomo parámetro.fuente
Puedes hacer algo como esto:
Esto funciona pero no está muy claro, además de
withque no se recomienda la declaración ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with ).fuente
Se
filterpuede lograr una solución más simple sin usar con enObject.entries()lugar deObject.keys()fuente
Hay muchas formas de lograr esto. La respuesta aceptada utiliza un enfoque Keys-Filter-Reduce, que no es el más eficaz.
En cambio, usar un
for...inbucle para recorrer las teclas de un objeto, o recorrer las teclas permitidas, y luego componer un nuevo objeto es ~ 50% más de rendimiento a .a. Ver jsPerf para los puntos de referencia de un caso de uso simple. Los resultados diferirán según los navegadores.
fuente
Puedes eliminar una clave específica de tu objeto
fuente
fuente
¡Manera simple! Para hacer esto.
fuente
Otra solución usando el
Array.reducemétodo "nuevo" :Demostración en este violín ...
Pero me gusta la solución en esta respuesta aquí que está usando y :
Object.fromEntriesArray.filterArray.includesDemostración en este violín ...
fuente
OK, ¿qué tal esto?
y llámalo así:
fuente
Esta función filtrará un objeto basado en una lista de claves, es más eficiente que la respuesta anterior ya que no tiene que usar Array.filter antes de llamar a reduce. entonces su O (n) en oposición a O (n + filtrado)
fuente
Durante el ciclo, no devuelva nada cuando se encuentren ciertas propiedades / claves y continúe con el resto:
fuente
Me sorprende que nadie haya sugerido esto todavía. Es súper limpio y muy explícito sobre las teclas que desea mantener.
O si quieres un revestimiento sucio:
fuente
Otro enfoque sería usar
Array.prototype.forEach()comoIncluye valores de solo aquellas claves que están disponibles en los datos sin procesar y, por lo tanto, evita agregar datos no deseados.
fuente
Esa sería mi solución:
fuente