【问题标题】:Creating and accessing array of objects in Javascript在 Javascript 中创建和访问对象数组
【发布时间】:2019-04-05 22:15:19
【问题描述】:

我无法弄清楚如何访问对象数组中的数据。我花了几个小时试图找到一些这样的例子,但我发现你必须通过索引号引用数组,这似乎效率不高。

例如,我有一张动物表和该动物的腿数。如何根据动物的名称访问该动物的值(腿数)。如果我将“人类”传递给一个函数,我希望能够返回“2”。

这个概念是不是我还不熟悉的东西?难道不能使用“键”来访问数组中的数据吗?如果我不知道索引号,我真的必须使用循环来搜索整个数组以细化正确的条目吗?

最简单的方法是什么?

let animalsLegs = [{animal: "human", legs: 2},
                   {animal: "horse", legs: 4},
                   {animal: "fish", legs: 0}]

function findLegs(animalToFind) {
  return animalLegs[animalToFind];
}

console.log(findLegs("human"));

我希望输出为2

【问题讨论】:

    标签: javascript arrays data-structures


    【解决方案1】:

    使用对象而不是数组:

    const animalLegsByAnimalName = {
      human: 2,
      horse: 4,
      fish: 0
    };
    function findLegs(animalToFind) {
      return animalLegsByAnimalName[animalToFind];
    }
    console.log(findLegs("human"));

    如果你想保持使用数组,还要使用对象进行快速、方便的查找,只需将reduce初始数组先放入上述对象:

    const animalsLegs = [{animal: "human", legs: 2},
                       {animal: "horse", legs: 4},
                       {animal: "fish", legs: 0}];
    const animalLegsByAnimalName = animalsLegs.reduce((a, { animal, legs }) => {
      a[animal] = legs;
      return a;
    }, {});
    
    function findLegs(animalToFind) {
      return animalLegsByAnimalName[animalToFind];
    }
    console.log(findLegs("human"));

    如果数组中的对象比这更复杂,并且您(例如)想要访问其他属性,则可以将对象的值设为数组中的对象,而不仅仅是 leg 的值属性:

    const animalsLegs = [{animal: "human", legs: 2},
                       {animal: "horse", legs: 4},
                       {animal: "fish", legs: 0}];
    const animalLegsByAnimalName = animalsLegs.reduce((a, animalObj) => {
      a[animalObj.animal] = animalObj;
      return a;
    }, {});
    
    function findLegs(animalToFind) {
      const foundAnimal = animalLegsByAnimalName[animalToFind];
      if (!foundAnimal) {
        return 'No animal found with that name!';
      }
      return foundAnimal.legs;
    }
    console.log(findLegs("human"));

    【讨论】:

    • 对象示例最初是我尝试过的。 Codepen 真的不喜欢我正在做的事情。这导致我尝试做更复杂的事情。感谢所有这些解决方案,我将深入研究其中的每一个,以真正了解正在发生的事情。非常感谢您的回复!!!
    • 我找不到任何参考或文档来说明第 7 行的额外 {} 是什么。我很难将头绕在箭头函数上,因为似乎有很多方法可以在所有方面使用它们和非常文档。
    • {} 不在箭头函数内(由于不涉及 this,因此箭头函数等效于标准 function) - {} 是第二个传递给reduce的参数,见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…,其第二个参数是累加器的初始值。
    【解决方案2】:

    如果要保留Array数据结构:

    function findLegs(animalToFind) {
      const animal = animalsLegs.find(animal => animal.name === animalToFind);
    
      return animal.legs;
    }
    

    PS:数组数据结构比对象效率低,找到一个项目需要O(n),而对象就像一个哈希表,你可以在O(1)中找到值。你可以阅读更多关于大 O 表示法here

    【讨论】:

    • 我无法想象animal => animal.name === animalToFind 正在做什么。 animal 在这段代码中做了什么?那是返回给const animal 的东西吗?这个逻辑叫什么?
    【解决方案3】:

    我认为数组最适合这种数据,你只需要编写一个小函数来检索你想要的。

    const animals = [
      { animal: "human",  legs: 2 },
      { animal: "horse",  legs: 4 },
      { animal: "fish",   legs: 0 }
    ]
    
    function getAnimalByName(name) {
      return animals.reduce((a, b) => b.animal !== name ? a : b, null)
    }
    
    // Human?!
    console.log(getAnimalByName('fish'))

    【讨论】:

    • 我在eloquentjavascript.net/05_higher_order.html 上读到了reduce 函数,但我终其一生都无法弄清楚我读到了什么以及它叫什么!谢谢!非常感谢您的回复!
    • 我想我也注意到console.log(getAnimalByName('human').legs) 返回了console.log(getAnimalByName('fish'))返回对象的腿。很高兴看到这两个。
    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多