创建指向同一个对象的多个键是否有效?
Is it efficient to create multiple keys pointing to the same object?
我有一个国家数组,每个国家都有三个属性。
const countries = [
{ name: "Poland", alpha: "POL", code: "616" },
{ name: "Hungary", alpha: "HUN", code: "348" },
// and so on...
]
稍后我想通过这些属性中的任何一个轻松访问每个国家/地区。
我正在考虑将此数组缩减为一个对象,该对象将具有三个指向同一个国家/地区对象的国家/地区的键。
像这样:
const countriesObject = countries.reduce((object, country) => {
const { name, alpha, code } = country;
// Create individual country object
object[name] = { ...country };
// Reference just created country object
object[code] = object[name];
object[alpha] = object[name];
return object;
});
最后我可以通过名称、代码或 alpha 访问每个国家/地区对象。
countriesObject["Poland"] // →
countriesObject["POL"] // → The same object
countriesObject["616"] // →
我的问题是,这会被认为是好的做法,还是有一些更好的方法可以达到相同或相似的结果?
谢谢!
没关系,正如您正确指出的那样,所有这些键都将指向同一个对象。我在这里看到的最大问题是使用这种方法很容易降低代码的可读性。假设我们有这个片段:
console.log( countriesObject[id] );
问题来了,这里的id是什么?是国家全名吗?或者只是阿尔法?或代码?你可能不在乎,真的,但如果你在乎,考虑给他们额外的结构:
const countriesObject = countries.reduce((object, country) => {
const { name, alpha, code } = country;
const countryCopy = { ...country };
// it makes sense to place them on the same line to show the intent
object.name[name] = object.code[code] = object.alpha[alpha] = countryCopy;
return object;
}, { name: {}, code: {}, alpha: {} });
另一个潜在的问题是您不能轻易地从此对象中删除国家;仅仅删除一个指向它的键是不够的,你必须去删除所有三个。但这在这里似乎不是什么大事;这看起来更像一本字典。
确实可以这样写:
var countries = {[
"poland": {
alpha: "POL", code: "616"
},
"hungary": {
alpha: "HUN", code: "348"
}
]}
像这样访问每个国家:
var poland = countries.poland;
反过来,这会产生更具可读性的代码:
var alpha = countries.poland.alpha;
而不是
var alpha = countries[0].alpha;
但是没有设置偏好。
我有一个国家数组,每个国家都有三个属性。
const countries = [
{ name: "Poland", alpha: "POL", code: "616" },
{ name: "Hungary", alpha: "HUN", code: "348" },
// and so on...
]
稍后我想通过这些属性中的任何一个轻松访问每个国家/地区。
我正在考虑将此数组缩减为一个对象,该对象将具有三个指向同一个国家/地区对象的国家/地区的键。
像这样:
const countriesObject = countries.reduce((object, country) => {
const { name, alpha, code } = country;
// Create individual country object
object[name] = { ...country };
// Reference just created country object
object[code] = object[name];
object[alpha] = object[name];
return object;
});
最后我可以通过名称、代码或 alpha 访问每个国家/地区对象。
countriesObject["Poland"] // →
countriesObject["POL"] // → The same object
countriesObject["616"] // →
我的问题是,这会被认为是好的做法,还是有一些更好的方法可以达到相同或相似的结果?
谢谢!
没关系,正如您正确指出的那样,所有这些键都将指向同一个对象。我在这里看到的最大问题是使用这种方法很容易降低代码的可读性。假设我们有这个片段:
console.log( countriesObject[id] );
问题来了,这里的id是什么?是国家全名吗?或者只是阿尔法?或代码?你可能不在乎,真的,但如果你在乎,考虑给他们额外的结构:
const countriesObject = countries.reduce((object, country) => {
const { name, alpha, code } = country;
const countryCopy = { ...country };
// it makes sense to place them on the same line to show the intent
object.name[name] = object.code[code] = object.alpha[alpha] = countryCopy;
return object;
}, { name: {}, code: {}, alpha: {} });
另一个潜在的问题是您不能轻易地从此对象中删除国家;仅仅删除一个指向它的键是不够的,你必须去删除所有三个。但这在这里似乎不是什么大事;这看起来更像一本字典。
确实可以这样写:
var countries = {[
"poland": {
alpha: "POL", code: "616"
},
"hungary": {
alpha: "HUN", code: "348"
}
]}
像这样访问每个国家:
var poland = countries.poland;
反过来,这会产生更具可读性的代码:
var alpha = countries.poland.alpha;
而不是
var alpha = countries[0].alpha;
但是没有设置偏好。