您能解释一下下面两个 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"}))
我被要求写一段代码,从传入的对象中反转所有键值对。这就是我写的。
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"}))