Создание и доступ к массиву объектов в Javascript - PullRequest
0 голосов
/ 06 апреля 2019

Мне сложно понять, как получить доступ к данным в массиве объектов.Я потратил часы, пытаясь найти какой-то пример этого, но все, что я нахожу, это то, что вы должны ссылаться на массивы по порядковому номеру, что не кажется эффективным.

Например, у меня есть таблица животных и количество ног этого животного.Как я могу получить доступ к значению (количество ног) для этого животного на основе названия животного.Если я передаю слово «человек» функции, я хочу вернуть «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 ]

1 голос
/ 06 апреля 2019

Если вы хотите сохранить структуру данных Array:

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

  return animal.legs;
}

PS: структура данных массива более неэффективна, чем объект, потребуется O (n), чтобы найти элемент, а объектэто как хеш-таблица, вы можете найти значения в O (1).Вы можете прочитать больше о Big O обозначения здесь .

1 голос
/ 06 апреля 2019

Я думаю, что массив лучше для такого рода данных, вам просто нужно написать небольшую функцию, чтобы получить то, что вы хотите.

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'))
1 голос
/ 06 апреля 2019

Использовать объект вместо массива:

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"));
...