Создать новый объект на основе предоставленного аргумента

#javascript

#javascript

Вопрос:

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

1) принимает имя жанра, параметр,

2) превратить его в объект,

3) добавьте соответствующую информацию и

4) поместите его в пустой массив, называемый bookshelf .

Однако моя проблема в том, что когда я назначаю аргумент genre = new Object(); , имя параметра genre — это имя объекта, а не аргумент, который я ему даю. Итак, если я введу жанр «Романтика», объект в массиве bookshelf будет жанром, а не «Романтика». Это проблема, потому что мне нужен массив для размещения разных названий жанров…

 var bookshelf = [];

//Input: genre = 'Romance'
function addGenre (genre) {
  var genre = new Object ();
  genre.someInfo = true;
  bookshelf.push(genre);
  return bookshelf;
  //Ideal output: Romance {someInfo: true}
  //Actual output: genre {someInfo: true}
}

//I attempted to use string literals, but I think that's illegal...
function addGenre (genre) {
  var `${genre}` = new Object ();
  genre.someInfo = true;
  bookshelf.push(genre);
  return bookshelf;
}
 

Отличной недели 🙂

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

1. «Я хочу создать динамические переменные» … позвольте мне остановить вас прямо здесь. Это редко (если вообще когда-либо) хорошая идея. Если вы хотите ссылаться на что-то динамически, используйте свойства объекта или какой-либо другой тип интерфейса сбора (например Map ). Если вам нужны списки объектов, используйте массивы

2. Если бы вы могли привести действительный пример JS bookshelf того, как должен выглядеть массив после addGenre вызова, это имело бы большое значение для получения подходящего ответа

Ответ №1:

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

 const bookshelf = [];
addGenre("romance");
console.log("bookshelf:");
console.log(bookshelf);

function addGenre (genre) {
  const newGenre = {
    [genre]: {someInfo: true}
  };
  bookshelf.push(newGenre);
  return bookshelf;
} 

(Кстати, объектные литералы, подобные тому, который связан с newGenre в этом примере, и литералы массива обычно предпочтительнее, чем использование new Object() and new Array() , хотя я не помню, почему с головы до ног.)

Ответ №2:

Жанр является свойством книги, название будет другим свойством.

Если вы хотите создать массив жанров, вы можете сделать это при добавлении книг в массив.

 "use strict";

let genres = [];
let books = [];

class Book {
  constructor(title = "", genre = "") {
    if (!genres.includes(genre)) {
      genres.push(genre);
    }
    this.title = title;
    this.genre = genre;
  }
}

books.push(new Book("Romeo and Juliet", "Romance"),
  new Book("Whodunit", "Mystery"),
  new Book("Stars", "SciFi"),
  new Book("Love and Donuts", "Romance"));

console.log(books);
console.log(genres);