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

问题描述

我有多个国家/地区,其中每个国家/地区都有三个属性

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

最后,我可以通过名称代码或字母访问每个国家对象。

countriesObject["Poland"] // → 
countriesObject["POL"]    // → The same object
countriesObject["616"]    // → 

我的问题是,这是否被视为一种好的做法,还是有一些更好的方法来实现相同或相似的结果?

谢谢!

解决方法

这很好,因为您正确地注意到,所有这些键都将指向同一对象。我在这里看到的最大问题是,使用这种方法很容易降低代码的可读性。假设我们有这个片段:

console.log( countriesObject[id] );

问题是,这里的ID是什么?它是全名吗?还是Alpha?或代码?您可能根本不在乎,是的,但是如果您这样做,请考虑给他们其他结构:

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