Инициализаторы в массиве, но я хочу управлять каждым объектом в массиве с помощью переменной

#javascript #arrays #class

#javascript #массивы #класс

Вопрос:

У меня есть массив с объектами, подобными этому:

 var animals = [new Animal("dog", "Max"), new Animal("dog", "Ben"), new Animal("cat", "Ella"), new Animal("cat", "Sophia")];
  

И теперь мне нужно управлять каждым объектом как переменной, вот так:

 console.log(dog_max.sound());
console.log(cat_sophia.eat());
  

Как мне это сделать?

Теоретически, я не знаю, какой объект имеет какой индекс,

Я буду использовать функцию случайного смешивания для массива.

Комментарии:

1. Простыми словами, вы запрашиваете динамические имена переменных.

2. опишите Animal (класс)

3. создайте метод разрешения / класс. Например. AnimalFinder.GetDogMax(Animal[])

4. зачем вам это вообще нужно?

5. У вас должен быть какой-то входной параметр. Например, «В этом массиве найдите dog объект с именем Max » . Это проблема XY , пожалуйста, опубликуйте свои входные данные и ожидаемый результат, а также четкое описание проблемы.

Ответ №1:

Вы хотите создать динамические имена переменных, что невозможно с eval()

Используя eval()

 class Animal{
  constructor(name1,name2){
    this.name1 = name1
    this.name2 = name2
  }
  sound(){
    return `${this.name1} makes sound`;
  }
}
var animals = [new Animal("dog", "Max"), new Animal("dog", "Ben"), new Animal("cat", "Ella"), new Animal("cat", "Sophia")];


for(let i = 0;i<animals.length;i  ){
  eval(`var ${animals[i].name1}_${animals[i].name2.toLowerCase()} = animals[i]`);
}

console.log(dog_max.sound())
console.log(cat_ella.sound())  

Используя Object

Но использование eval() не рекомендуется. Вы можете создать объект для хранения этих

 class Animal{
  constructor(name1,name2){
    this.name1 = name1
    this.name2 = name2
  }
  sound(){
    return `${this.name1} makes sound`;
  }
}
var animals = [new Animal("dog", "Max"), new Animal("dog", "Ben"), new Animal("cat", "Ella"), new Animal("cat", "Sophia")];

let a = {};
for(let i = 0;i<animals.length;i  ){
  a[`${animals[i].name1}_${animals[i].name2.toLowerCase()}`] = animals[i]
}

console.log(a.dog_max.sound())
console.log(a.cat_ella.sound())