我在弄清楚如何访问对象数组中的数据时遇到了麻烦。我花了数小时试图找到一些例子,但是我发现您必须用索引号引用数组,这似乎效率不高。
例如,我有一张动物表和该动物的腿数。如何根据动物的名称访问该动物的值(腿数)。如果将“人类”传递给函数,我希望能够返回“ 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
。
答案 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'))