您能解释一下下面两个 javascript 代码片段之间的区别吗?

Can you explain the diffrence between two javascript code snippets below?

我被要求写一段代码,从传入的对象中反转所有键值对。这就是我写的。

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

当 运行 使用测试文件时,我的代码失败而答案代码通过。推理是我的返回未定义。

来自测试的错误代码:

Failed: _.invert({originalKey: "originalValue"})["originalValue"]) returned undefined instead of 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 变量的语句。


就个人而言,我认为第二个代码示例容易出错并且很容易被破坏;它也不适合制作可重用的功能,因为:

  • 传递给这个函数的对象不会总是有一个键
  • 您不会总是知道对象中每个键的值,即使您知道这些值,如果对象有多个键,这种方法也行不通

您应该使用计算的 属性 名称,它不依赖于变量名称是否与对象中的键值相同。

that inverts all key value pairs from an object passed in

您必须将每个 属性 添加到同一个对象,而不是为每个 属性 创建新对象。

function invert(object) {
  let newObj = {};
  for(let key in object){
      const original = object[key];
      newObj[original] = key;  // add property to same 'newObj' object
  }
      return newObj;        
}

console.log(invert({originalKey: "originalValue", anotherKey: "anotherValue"}))