Si el valor de las claves predefinidas es una cadena vacía, me gustaría cambiarlo a un valor nulo.

Así que:

const foo = {
  first: '',
  second: 'bar',
  third: '',
  fourth: '',
  fifth: '',
}

Debería normalizarse a:

const foo = {
  first: null,
  second: 'bar',
  third: '',
  fourth: null,
  fifth: '',
}

Ahora el siguiente ejemplo funciona:

const normalize = (payload, keys) => {
  const clone = { ...payload }
  Object.entries(payload).forEach(([key, value]) => {
    if (keys.includes(key) && value === '') {
      clone[key] = null;
    }
  });
  return clone;
}

const foo = {
  first: '',
  second: 'bar',
  third: '',
  fourth: '',
  fifth: '',
}

console.log(normalize(foo, ['first', 'third']));

Pero la variable 'clon' no es tan inteligente.

Ahora hay un método de uso común mediante Object.assign ().

¿Es posible hacer esto?

0
Remi 27 ago. 2020 a las 00:36

3 respuestas

La mejor respuesta

Enfoque alternativo que recorre la matriz de argumentos de claves. No tiene sentido recorrer todas las claves del objeto, sino solo las necesarias

const normalize = (payload, keys) => {
  return keys.reduce((a, k) => {
    (a[k] === '') && (a[k] = null)
    return a;
  }, { ...payload })
}

const foo = {
  first: '',
  second: 'bar',
  third: '',
  fourth: '',
  fifth: '',
}

console.log(normalize(foo, ['first', 'third']));
3
charlietfl 26 ago. 2020 a las 21:58

¿Por qué no recorrer la matriz y mutar el objeto?

const foo = {
  first: '',
  second: 'bar',
  third: '',
  fourth: '',
  fifth: '',
}


function normalize(obj, arr) {
const newObj={...obj}
  for (let i = 0; i < arr.length; i++) {
    newObj[arr[i]] = null;
  }
  return newObj;
}
console.log(normalize(foo, ['first', 'third']));
0
Eugen Sunic 26 ago. 2020 a las 21:59

Puede usar iterar con for...in y verificar si la clave coincide con some()

const foo = {
  first: '',
  second: 'bar',
  third: '',
  fourth: '',
  fifth: '',
}

const normalize = ({...obj}, arr) => {
  for (let key in obj) {
    if(arr.some(k => k === key)) {
      obj[key] = null;
    }
  }

  return obj;
}

console.log(normalize(foo, ['third', 'fifth']));
0
zb22 26 ago. 2020 a las 22:08