validar validacion recorrer objetos lista formularios formulario enviar ejemplos con array antes javascript immutability

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.

Aquí una prueba:

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;