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.keys
para enumerar todas las propiedades enraw
(los datos originales), luegoArray.prototype.filter
para seleccionar claves que están presentes en la lista permitida, usandoArray.prototype.includes
para asegurarse de que estén presentesArray.prototype.reduce
para 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
includes
cheque de la siguiente manera:Incluyo este ejemplo para mostrar una solución basada en la mutación, pero no sugiero usarla.
fuente
Array.prototype.includes
no 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
newData
contiene:O, si tiene la clave almacenada como una cadena:
En este último caso,
[key]
se convierte enitem2
pero dado que está utilizando unaconst
asignació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/…filter
yreduce
._
no importa, es solo un nombre de variable, puedes cambiarle el nombre a lo que quierasomit
funció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.reduce
interior,oreduce
pero podrías escribirlo fácilmente desde cerofuente
oreduce
, el primeroacc
está sombreado.reduce(acc, k)
, y enofilter
elo
está sombreado,oreduce
se llama con una variable llamadao
también, ¿cuál es cuál?ofilter
la variableo
está 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;acc
no 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
allowed
como parámetro.fuente
Puedes hacer algo como esto:
Esto funciona pero no está muy claro, además de
with
que no se recomienda la declaración ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with ).fuente
Se
filter
puede 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...in
bucle 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.reduce
método "nuevo" :Demostración en este violín ...
Pero me gusta la solución en esta respuesta aquí que está usando y :
Object.fromEntries
Array.filter
Array.includes
Demostració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