validacion - validar formulario javascript html5
Eliminar valor del objeto sin mutaciĆ³n (6)
¿Cuál es una manera buena y corta de eliminar un valor de un objeto en una clave específica sin mutar el objeto original?
Me gustaría hacer algo como:
let o = {firstname: ''Jane'', lastname: ''Doe''};
let o2 = doSomething(o, ''lastname'');
console.log(o.lastname); // ''Doe''
console.log(o2.lastname); // undefined
Sé que hay muchas bibliotecas de inmutabilidad para tales tareas, pero me gustaría salir sin una biblioteca. Pero para hacer esto, un requisito sería tener una manera fácil y corta que se pueda utilizar en todo el código, sin abstraer el método como una función de utilidad.
Por ejemplo, para agregar un valor, hago lo siguiente:
let o2 = {...o1, age: 31};
Esto es bastante corto, fácil de recordar y no necesita una función de utilidad.
¿Hay algo como esto para eliminar un valor? ES6 es muy bienvenido.
¡Muchas gracias!
Actualizar:
Puede eliminar una propiedad de un objeto con una tarea de Desestructuración complicada:
const doSomething = (obj, prop) => {
let {[prop]: omit, ...res} = obj
return res
}
Sin embargo, si el nombre de la propiedad que desea eliminar es estático, puede eliminarlo con una sola línea:
let {lastname, ...o2} = o
La forma más fácil es simplemente
O podrías clonar tu objeto antes de mutarlo:
const doSomething = (obj, prop) => {
let res = Object.assign({}, obj)
delete res[prop]
return res
}
Alternativamente, podría usar la
función
omit
de la biblioteca de utilidades
lodash
:
let o2 = _.omit(o, ''lastname'')
Está disponible como parte del paquete lodash , o como un paquete lodash.omit independiente.
Como se sugiere en los comentarios anteriores, si desea extender esto para eliminar más de un elemento de su
object
me gusta usar el
filter
.
y
reduce
p.ej
const o = {
"firstname": "Jane",
"lastname": "Doe",
"middlename": "Kate",
"age": 23,
"_id": "599ad9f8ebe5183011f70835",
"index": 0,
"guid": "1dbb6a4e-f82d-4e32-bb4c-15ed783c70ca",
"isActive": true,
"balance": "$1,510.89",
"picture": "http://placehold.it/32x32",
"eyeColor": "green",
"registered": "2014-08-17T09:21:18 -10:00",
"tags": [
"consequat",
"ut",
"qui",
"nulla",
"do",
"sunt",
"anim"
]
};
const removeItems = [''balance'', ''picture'', ''tags'']
console.log(formatObj(o, removeItems))
function formatObj(obj, removeItems) {
return {
...Object.keys(obj)
.filter(item => !isInArray(item, removeItems))
.reduce((newObj, item) => {
return {
...newObj, [item]: obj[item]
}
}, {})
}
}
function isInArray(value, array) {
return array.indexOf(value) > -1;
}
Con la desestructuración de objetos ES7:
const myObject = {
a: 1,
b: 2,
c: 3
};
const { a, ...noA } = myObject;
console.log(noA); // => { b: 2, c: 3 }
Para agregar un poco de sabor aportando rendimiento. Mira este hilo abajo
https://github.com/googleapis/google-api-nodejs-client/issues/375
El uso del operador de eliminación tiene efectos negativos de rendimiento para el patrón de clases ocultas V8. En general se recomienda no usarlo.
Alternativamente, para eliminar las propiedades enumerables propias del objeto, podríamos crear una nueva copia del objeto sin esas propiedades (ejemplo usando lodash):
_.omit (o, ''prop'', ''prop2'')
O incluso defina el valor de la propiedad como nulo o indefinido (que se ignora implícitamente al serializar a JSON):
o.prop = indefinido
Puedes usar también la forma destructiva
const obj = {a: 1, b: 2, c: 3}
const unwantedKey = ''a''
const _ = require(''lodash'')
const objCopy = _.cloneDeep(obj)
delete objCopy[unwantedKey]
// objCopy = {b: 2, c: 3}
Y un ejemplo más práctico:
this._volumes[this._minCandle] = undefined; { const {[this._minCandle]: remove, ...rest} = this._volumes; this._volumes = rest; }
Como puede ver, puede usar
[somePropsVarForDynamicName]: scopeVarName
sintaxis
[somePropsVarForDynamicName]: scopeVarName
para nombres dinámicos.
Y puede poner todo entre paréntesis (nuevo bloque) para que el resto sea basura recolectada después.
ejecutivo:
O podemos ir con alguna función como
function deleteProps(obj, props) { if (!Array.isArray(props)) props = [props]; return Object.keys(obj).reduce((newObj, prop) => { if (!props.includes(prop)) { newObj[prop] = obj[prop]; } return newObj; }, {}); }
para mecanografiado
function deleteProps(obj: Object, props: string[]) { if (!Array.isArray(props)) props = [props]; return Object.keys(obj).reduce((newObj, prop) => { if (!props.includes(prop)) { newObj[prop] = obj[prop]; } return newObj; }, {}); }
Uso:
let a = {propH: ''hi'', propB: ''bye'', propO: ''ok''}; a = deleteProps(a, ''propB''); // or a = deleteProps(a, [''propB'', ''propO'']);
De esta forma se crea un nuevo objeto. Y se mantiene la propiedad rápida del objeto. Que puede ser importante o importante. Si se accede al mapeo y al objeto muchas veces.
También asociar
undefined
puede ser una buena manera de hacerlo.
Cuando te lo puedas permitir.
Y para las teclas también puede verificar el valor.
Por ejemplo, para obtener todas las claves activas, debe hacer algo como:
const allActiveKeys = Object.keys(myObj).filter(k => myObj[k] !== undefined); //or const allActiveKeys = Object.keys(myObj).filter(k => myObj[k]); // if any false evaluated value is to be stripped.
Sin definir no es adecuado para una gran lista. O desarrollo a lo largo del tiempo con muchos accesorios para entrar. Como el uso de la memoria seguirá creciendo y nunca se limpiará. Entonces depende del uso. Y solo crear un nuevo objeto parece ser la buena manera.
Entonces, la
Premature optimization is the root of all evil
entrará en acción. Por lo tanto, debe ser consciente de la compensación.
Y lo que se necesita y lo que no.
Nota sobre _.omit () de lodash
Se eliminó de la versión 5. No se puede encontrar en el repositorio. Y aquí un tema que habla de ello.
https://github.com/lodash/lodash/issues/2930
v8
Puede verificar esto, que es una buena lectura https://v8.dev/blog/fast-properties
con lodash clone Profundizar y eliminar
(nota: el clon lodash puede usarse en su lugar para objetos poco profundos)
const obj = {a: 1, b: 2, c: 3} const unwantedKey = ''a'' const _ = require(''lodash'') const objCopy = _.cloneDeep(obj) delete objCopy[unwantedKey] // objCopy = {b: 2, c: 3}
solución de una línea
const removeKey = (key, {[key]: _, ...rest}) => rest;