创建指向同一个对象的多个键是否有效?

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;

但是没有设置偏好。

Docs