在Javascript中创建和访问对象数组

时间:2019-04-05 22:15:19

标签: javascript arrays data-structures

我在弄清楚如何访问对象数组中的数据时遇到了麻烦。我花了数小时试图找到一些例子,但是我发现您必须用索引号引用数组,这似乎效率不高。

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

3 个答案:

答案 0 :(得分: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"));

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

leg

答案 1 :(得分:1)

如果要保留Array数据结构:

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

  return animal.legs;
}

PS:数组数据结构比对象低效率,需要O(n)才能找到项目,而对象就像哈希表一样,您可以在O(1)中找到值。您可以阅读有关大O符号here的更多信息。

答案 2 :(得分:1)

我认为数组最适合此类数据,您只需编写一个小函数即可检索想要的内容。

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'))