你能解释一下下面两个javascript代码片段之间的区别吗?
我被要求写出一段代码来反转传入对象的所有键值对。这就是我写的。
invert(object){
let newObj = {};
for(let key in object){
const original = object[key];
newObj = {original : key}
}
return newObj;
}
显然那是有效的(我不知道为什么)。问题的答案是
invert(object){
let invertedObject = {};
for(let key in object){
const originalValue = object[key];
invertedObject = {originalValue : key}
}
return invertedObject;
}
当使用测试文件运行时,我的代码失败而答案代码通过。推理是我的返回未定义。
来自测试的错误代码:
失败:_.invert({originalKey: "originalValue"})["originalValue"]) 返回 undefined 而不是 originalKey
回答
不同之处在于以下语句:
newObj = {original : key}
在您的代码中,当您original在 中用作键时newObj,不是将original变量的值用作键,'original'而是字面上用作键。
original您的代码中未使用该变量。
您可以通过使用计算属性名称来解决该问题:
newObj = { [original]: key };
不使用计算属性,newObj将是:
{
original:"originalKey"
}
但使用计算属性名称,newObj将是:
{
originalValue:"originalKey"
}
第二个代码示例有效,因为在以下语句中
invertedObject = {originalValue : key}
他们使用 的值originalKey作为键名。所以返回对象的键将是'originalValue'.
另请注意,第二个代码示例中的以下语句
const originalValue = object[key];
是不必要的,因为originalValue没有使用变量。第二个代码示例也可以在没有上述语句的情况下工作。
如果第二个代码示例使用计算属性名称为:
invertedObject = { [originalValue] : key }
那么你需要声明originalValue变量的语句。
就我个人而言,我认为第二个代码示例容易出错,而且很容易破解;制作可重用功能也不实用,因为:
- 传递给这个函数的对象并不总是只有一个键
- 你不会总是知道对象中每个键的值,即使你知道这些值,如果对象有多个键,这种方法也行不通
您应该使用不依赖于与对象中键的值相同的变量名称的计算属性名称。