Suponiendo que el valor firsName y lastName proviene de alguna fuente de datos. El valor a veces puede ser nulo o ambos indefinido. fullName concatena a los dos.

let a = {};
let b = {
    fullName: a && a.firstName+' '+a.lastName
};
console.log("fullName is "+JSON.stringify(b.fullName)); // fullName is "undefined undefined"

a = {
    firstName: null,
    lastName: null
};
b = {
    fullName: a.firstName+' '+a.lastName
};
console.log("fullName is "+JSON.stringify(b.fullName)); // fullName is "null null"

b = {
    fullName: {...a.firstName, ...' ', ...a.lastName}
};
console.log("fullName is "+JSON.stringify(b.fullName)); // fullName is {"0":" "}

b = {
    fullName: {...a.firstName, ...a.lastName}
};
console.log("fullName is "+JSON.stringify(b.fullName)); // fullName is {}

Mi solución actual es

const getFullName = (firstName, lastName ) => {
    if ((typeof firstName == "undefined" || firstName === null) && (typeof lastName == "undefined" || lastName === null)) {
            return null;
    }
    else { 
        return firstName+' '+lastName
    }
}

b = {
    fullName: getFullName(a.firstName, a.lastName)
};
console.log("fullName with function is "+JSON.stringify(b.fullName)); // fullName with function is null

a = {};
console.log("fullName with function is "+JSON.stringify(b.fullName)); // fullName with function is null

¿Hay una mejor manera de hacer que b.fullName tenga un valor nulo (sin escribir una función)?

1
Shawn 11 may. 2019 a las 01:50

8 respuestas

La mejor respuesta

La siguiente sería una mejor solución:

return [firstName, lastName].filter(it => !!it).join(" ") || null

Tenga en cuenta que esto también incluirá "" como nulo / indefinido y evite incluir "nulo" en la cadena si proporciona uno pero no el otro. En general, esto es probablemente deseable para la función que está escribiendo.

Por ejemplo: getFullName("John", null) devolvería "John"

3
Michael 10 may. 2019 a las 22:58

Este es uno de los pocos casos en los que es beneficioso usar el operador de igualdad flexible, ya que null y undefined son ligeramente iguales entre sí, pero a nada más. Entonces podría simplificar su condicional a:

const getFullName = (firstName, lastName ) => {
    if (firstName == null && lastName == null) {
        return null;
    } else { 
        return firstName + ' ' + lastName
    }
}
1
Ben Blank 10 may. 2019 a las 22:59

Otra oneliner podría ser

const getFullName = (firstname, lastname) => (firstname || '' + ' ' + (lastname || '')).trim() || null

Explicación:

firstname || '' si firstname se evalúa como valor anulable (0, '', null, false, undefined, NaN...) imprimirá una cadena vacía. Luego concatenamos con un espacio en blanco y hacemos la misma operación. Cuidado, esta vez encapsulo la operación entre paréntesis debido a la evaluación izquierda / derecha en JS Recorte el resultado si es una cadena vacía, devolverá nulo; de lo contrario, devolverá nombre o apellido o ambos

0
GuillaumeL 10 may. 2019 a las 23:13

Aquí hay una forma de tratarlo usando un ternario.

const fName = undefined;// undefined;
const lName = undefined;

const fullName = (fName || lName) ? `${fName||""} ${lName||""}`.trim() : null;

console.log(fullName);

Y aquí usamos destructuring con valores default.

const person1 = {
  firstName: undefined,
  lastName: undefined
}

const person2 = {
  firstName: "Bob",
  lastName: undefined
}

const displayName = ({firstName: f='', lastName: l=''}, {x: fn} = {x: f+' '+l}) => {
  fn = fn.trim();
  console.log((fn==='') ? undefined : fn);
}


displayName(person1);
displayName(person2);
1
VLAZ 10 may. 2019 a las 23:47

Creo que lo estás haciendo demasiado difícil, lo cual está bien. Siempre lo hago yo mismo. Sin embargo, permítanme sugerir una solución simple:

const getFullName = (firstName, lastName ) => {
    firstName = firstName || "";
    lastName = lastName || "";
    if ( firstName != "" && lastName != "" ) {
        return firstName & " " & lastName;
    }
    else if ( firstName == "" && lastName == "" ) {
        return null;
    }
    else {
        return firstName || lastName;
    }
}

Básicamente convierte undefined y null en cadenas vacías, y luego solo trata las cadenas vacías. O tienes ambos nombres, ninguno de los dos, o solo uno.

0
Darrin Cullop 10 may. 2019 a las 23:10

Este es probablemente el formato más simple.

Concatena los dos valores. Si no hay ningún valor, entonces usamos una cadena vacía. Y luego recortar el resultado. Si no queda nada, devuelva null.

Lo que esto no permite es una cadena vacía tanto para el nombre como para el apellido.

function makeName(f, l) {
  return `${f||''} ${l||''}`.trim() || null
}

console.log(`[${makeName()}]`);
console.log(`[${makeName('', '')}]`);
console.log(`[${makeName('John')}]`);
console.log(`[${makeName('John', 'Smith')}]`);
0
Intervalia 10 may. 2019 a las 23:14

Desafortunadamente, no hay una muy buena forma simple de hacer esto. Puede acortar el código necesario:

let firstName = null;
let lastName = undefined;

let fullName = ((firstName || "") + " " + (lastName || "")).trim() || null;

console.log(fullName)

Lo cual no es muy bonito. Un código ligeramente mejor podría ser

let firstName = null;
let lastName = undefined;

let fullName = [firstName, lastName].filter(s => s != null).join(' ') || null;

console.log(fullName)

Sin embargo, sigue siendo engorroso repetirlo muchas veces.

En cambio, aún puede usar una función y generalizarla a cualquier cantidad de parámetros, para que pueda reutilizarla más tarde en otros lugares:

const combine = (...strings) => strings.filter(s => s != null).join(" ") || null;

console.log(combine("Alice"))
console.log(combine("Bob", null))
console.log(combine("Fred", "Bloggs"))
console.log(combine("Samuel", "L", "Jackson"))

Si desea generalizar también el delimitador, puede hacerlo fácilmente mediante una aplicación parcial:

const combine = (delimiter = " ") => (...strings) => strings.filter(s => s != null).join(delimiter) || null;

const combineNames = combine();
const combineCSV = combine(",")

console.log("--- names ---")
console.log(combineNames("Alice"))
console.log(combineNames("Bob", null))
console.log(combineNames("Fred", "Bloggs"))
console.log(combineNames("Samuel", "L", "Jackson"))

console.log("--- comma separated values ---")
console.log(combineCSV("Alice"))
console.log(combineCSV("Bob", null))
console.log(combineCSV("Fred", "Bloggs"))
console.log(combineCSV("Samuel", "L", "Jackson"))
1
VLAZ 10 may. 2019 a las 23:19

return firstName?lastName?firstName+' '+lastName:null:null;

0
halit 10 may. 2019 a las 23:04