Encontré una lista de operaciones de datos y el valor perdido de [0].
No pude averiguar por qué. es bueno si cambio el valor a [1], pero si pongo el valor [0], desaparece.
Aquí está el código:
let data = { title:"hello world", value: [0] } let sanitized = removeNull(data); console.log(sanitized) // ------------------------------------------------------------------------ function removeNull(obj) { Object.keys(obj).forEach(k => (obj[k] && typeof obj[k] === 'object') && removeNull(obj[k]) || (typeof obj[k] !== 'boolean' && !obj[k] && obj[k] !== undefined) && delete obj[k] ); return obj; };Cuando obj[k] es 0 , se está ejecutando delete obj[k] porque en la expresión:
(obj[k] && typeof obj[k] === 'object') && removeNull(obj[k]) || (typeof obj[k] !== 'boolean' && !obj[k] && obj[k] !== undefined) && delete obj[k] ... obj[k] es falso (por lo que toda la línea superior anterior es falsa. Luego procedemos a verificar la segunda línea debido a ||.
typeof 0 es Number que es !== boolean , así que eso es cierto...!0 es cierto...0 !== undefined también es cierto... lo que nos deja comprobar la veracidad del término final, que es delete obj[k] . ...lo cual resulta ser true , por cierto, no es que importe, porque 0 se elimina en virtud de que comprobamos el valor del último término.
Ahhh, typeof obj[k] !== 'boolean' && !obj[k] && obj[k] !== undefined se evalúa como verdadero porque 0 se considera falso en Javascript. Entonces !obj[k] es verdadero.
La función removeEmpty actual está probando si el resultado de JSON.stringify(o[k] === "[0]") es veraz. Probablemente quisiste probar si los contenidos en cadena de o[k] son iguales a "[0]". Así que algo como JSON.stringify(o[k]) === "[0]" debería resolver tu problema.
Algunos conceptos clave:
0 es falsotypeof null === 'object' es verdaderotypeof [] === 'object' es verdaderoActualmente, el código se ejecuta de la siguiente manera:
obj[k] = [0] , se llama a removeNull() en [0] porque las matrices son de tipo object .[0] en esa llamada de removeNull(), k comienza como 0 (el índice en la matriz) y obj[k] se convierte en 0 (el valor). 0 pasa typeof 0 !== 'boolean' && !0 && 0 !== undefined , por lo que se deleted y se convierte en un elemento vacío en la matriz. delete vacía los elementos de la matriz pero no elimina el índice.Puede haber algunas formas de reorganizar el código para que sea un poco más seguro y fácil de depurar, dependiendo de si también desea eliminar nulos en las matrices.
let data = { title:"hello world", // not removed value: [ 0, // not removed null // removed ], name: null, // removed author: { name: null, // removed hats: false, // not removed pets: [null] // --> [] partners: [] // --> [] } } const sanitized = removeNull(data); console.log(sanitized) // ----------------------------------------------------------------------- function removeNull(obj) { Object.keys(obj).forEach((key) => { if(obj[key] === null) { // removes the element differently // depending on whether obj is array or object. return Array.isArray(obj) ? obj.splice(key, 1) : delete obj[key] } if(typeof obj[key] === 'object') removeNull(obj[key]) }) return obj } Si no le importa verificar null en las matrices, agregue && !Array.isArray(obj) a la segunda verificación y elimine el ternario que decide cómo eliminar.
Una nota: además de devolver el nuevo objeto sin valores nulos, este código (y su código) actualmente también modifican el objeto original.