我试图在javascript中解决此问题:写一个函数,将对象作为包含个人信息属性的参数。提取firstName,lastName,size和weight(如果可用)。如果给定size或weight,则将值转换为字符串。将单位cm附加到尺寸上。将单位kg附加到重量上。返回具有我们感兴趣的所有可用属性的新对象。因此,我给出了以下解决方案:
function myFunction(obj) {
const {fn:fn , ln:ln ,size:s ,weight:w}= obj;
var newObj= {fn:fn , ln:ln};
if (s!==undefined && w!==undefined){
newObj={fn:fn , ln:ln ,size:s.toString()+'cm' ,weight:w.toString()+'kg'};
}
else if(s===undefined || w===undefined){
if (s===undefined && w!==undefined){
newObj={fn:fn , ln:ln ,weight:w.toString()+'kg'};
}
else if (s!==undefined && w===undefined) {
newObj={fn:fn , ln:ln ,size:s.toString()+'cm'};
}
}
return newObj
}
而作者的解决方案是:
function myFunction(obj) {
return {
fn: obj.fn,
ln: obj.ln,
...(obj.size && { size: `${obj.size}cm` }),
...(obj.weight && { weight: `${obj.weight}kg` }),
};
}
有人可以向我解释(或让我参考我可以找到答案的地方)使用散布运算符的行,为什么在未定义重量或大小的值的情况下起作用?谢谢
那里发生了几件事:
对象传播语法(不是运算符)使您可以“传播”值null
和undefined
。当您这样做时,没有属性添加到正在创建的对象。(就像一样Object.assign
,它忽略null
并undefined
在其参数列表中。)
的&&
操作者接受两个操作数,首先计算,并且如果该值是falsy,采用该值作为其结果; 它仅求值第二个操作数,并在第一个值为true时将其作为结果。
将这两件事放在一起,在对象文字中,该...(obj.size && { size: `${obj.size}cm` })
部分的工作方式如下:如果obj.size
为is undefined
,则基本上...undefined
它不会向该对象添加任何属性。但是,如果obj.size
为真,则对第二个操作数{ size: `${obj.size}cm` }
(对象文字)进行求值,得到一个对象,最后得到的...{ size: `${obj.size}cm` }
结果是size
向要创建的对象添加属性。
注意:如果obj.size
为0
,则结果将没有任何size
属性,因为它0
是虚假的。因此,作者很可能会错误地放弃该解决方案size
或weight
采用该解决方案:
function myFunction(obj) {
return {
fn: obj.fn,
ln: obj.ln,
...(obj.size && { size: `${obj.size}cm` }),
...(obj.weight && { weight: `${obj.weight}kg` }),
};
}
console.log(myFunction({fn: "fn", ln: "ln", size: 0}));
当obj.size
为is时0
,您最终...0
得到对象,该对象(从理论上讲Number
)从基元创建一个对象(而不是基元),0
然后扩展其属性。它不会在对象中放置任何属性,因为默认情况下,Number
对象没有任何自己的可枚举属性。
现在,如果这个问题被定义为使得size
和weight
永远0
,很公平。但是在推广该解决方案之前,我会仔细考虑。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句