【问题标题】:Is it efficient to create multiple keys pointing to the same object?创建指向同一个对象的多个键是否有效?
【发布时间】:2021-01-25 19:56:58
【问题描述】:

我有一系列国家/地区,每个国家/地区都有三个属性。

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"]    // → 

我的问题是,这会被认为是一种好的做法,还是有一些更好的方法可以达到相同或相似的结果?

谢谢!

【问题讨论】:

  • 这对我来说听起来像是过早的优化
  • 那么将这些国家存储为一个数组并使用.find() 方法获取每个国家/地区就可以了吗?
  • 我暂时说是的,最好的方法是衡量实际性能
  • 这些看起来像 ISO3166-1 国家代码。如果是这样的话,目前有 249 个国家有明确的代码。所有名称、字母和代码都是唯一的,并且不会经常更改,所以为什么不简单地在静态 js 文件中定义变量并在需要时加载,而不是在每个使用它们的 HTML 页面中即时创建它们?但是,我支持 sitek94 - 为什么不简单地使用 .find()?您多久需要从变量而不是数组中查找值,因为您不知道它是名称、字母还是代码值?为什么其余的代码/页面不提供那个位?
  • @ATD "为什么不简单地在静态 js 文件中定义变量并在需要时加载它" 我一直在解决解决方案如此简单的问题。我制作了一个静态文件,非常适合我的需求。谢谢你:)

标签: javascript javascript-objects pass-by-reference


【解决方案1】:

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

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

另一个潜在的问题是你不能轻易地从这个对象中删除国家;仅仅删除一个指向它的键是不够的,你必须去删除所有三个。但这似乎不是什么大事。这看起来更像是一本字典。

【讨论】:

  • 我明白你的意思。我不担心第二个问题,因为就像你说的那样:“更像一本字典”,但我真的没有考虑可读性,现在我看到有问题。我想我会创建另一个属性 id 并在整个应用程序中通过他们的 ID 访问这些国家/地区。
  • object.name[name] = object.code[code] = object.alpha[alpha] = countryCopy,太棒了,我不知道我可以像这样使用赋值运算符。谢谢!
【解决方案2】:

你确实可以这样写:

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

【讨论】:

    猜你喜欢
    • 2015-02-18
    • 2015-04-17
    • 2012-08-22
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多