javascript - JavaScript如何连接两个空值或未定义并返回null

假定值firsName和lastName来自某些数据源,值有时既可以是空的,也可以是未定义的,fullName将两者结合起来。


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 {}



我目前的解决方案是


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



是否有更好的方法使b.fullName具有空(不编写函数)值?

时间:

以下将是一个更好的解决方案:


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



getFullName("John", null)将返回"john""

然后,你可以简化以下条件:


const getFullName = (firstName, lastName ) => {


 if (firstName == null && lastName == null) {


 return null;


 } else { 


 return firstName + ' ' + lastName


 }


}



不幸的是,没有一个很好的方法来做这个,你可以缩短所需的代码:


let firstName = null;


let lastName = undefined;



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



console.log(fullName)

这不是很漂亮。一个非常好的代码可能是


let firstName = null;


let lastName = undefined;



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



console.log(fullName)

然而,反复重复它仍然是一个很麻烦的做法。

相反,你仍然可以使用函数,并且对任意数量的参数进行归纳,这样以后你就可以在其他地方重用它:


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"))

如果你还想对分隔符进行归纳,那么可以通过部分应用程序轻松地完成该操作:


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"))
,

这里有一个用三元来处理它的方法。


const fName = undefined;// undefined;


const lName = undefined;



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



console.log(fullName);

这里我们使用destructuringdefault值。


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);
,

我觉得你让它变得太困难了,我总是这么做,但是,让我提出一个简单的解决方案:


const getFullName = (firstName, lastName ) => {


 firstName = firstName ||"";


 lastName = lastName ||"";


 if ( firstName !="" && lastName !="" ) {


 return firstName &"" & lastName;


 }


 else if ( firstName =="" && lastName =="" ) {


 return null;


 }


 else {


 return firstName || lastName;


 }


}



它基本上把undefinednull变成空字符串,然后它只处理空字符串,要么是你的名字要么是名字要么只有一个。

,

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



说明:

如果将firstname计算为可为空值(firstname ||'' ),则为: 0, '', null, false, undefined, NaN... ),它将打印空字符串,然后我们用空格进行连接,然后执行同样的操作。 小心,这次我封装了括号之间的操作,因为JS中的左/右评价修剪结果如果它是一个空字符串它将返回null,否则它将返回名字或姓氏或两者,

,

这可能是最简单的格式。

你将两个值连接起来,如果没有值,则默认为空字符串,然后修剪结果,如果没有剩下的东西,返回null

不允许的是一个空字符串,用于第一个和最后一个名字。


function makeName(f, l) {


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


}



console.log(`[${makeName()}]`);


console.log(`[${makeName('', '')}]`);


console.log(`[${makeName('John')}]`);


console.log(`[${makeName('John', 'Smith')}]`);
...