есть ли способ получить значение из объекта через его ключ?

#javascript #vue.js

#javascript #vue.js

Вопрос:

 el: "#app",
data: {

songs : { 

songNames: [{holiday:'mp3/01.mp3'}, {loveme:'mp3/02.mp3'}, {byebye:'mp3/03.mp3'}],

        }

songCheck: ['byebye'],
foundSong: new Audio (" "),
  

Здравствуйте,
Я хочу получить значение «mp3 / 03.mp3» из массива songNames, проверив элемент массива songCheck и присвоив возвращаемой переменной «mp3 / 03.mp3» следующим образом:

 foundSong: new Audio ("mp3/03.mp3 "), 
  

затем

 this.foundSong.play();
  

пожалуйста, помогите мне. Спасибо

Ответ №1:

Хотя я не понимаю всего, что вы хотите, возможно, этот фрагмент поможет вам решить вашу проблему:

 const songNames = [{holiday:'mp3/01.mp3'}, {loveme:'mp3/02.mp3'}, {byebye:'mp3/03.mp3'}];

// 1. Key you are looking for
const searchKey = "byebye";

// 2. Find object we are looking for
// - .find loops over all songNames objects
// - for each object we check if it has property we are looking for i.e. "byebye"
// - first object that match criteria is returned or undefined if there are no matches
const searchResult = songNames.find(song => song.hasOwnProperty(searchKey));

// 3. Get desired value from object
console.log(searchResult amp;amp; searchResult[searchKey]); // will return "mp3/03.mp3" in our case where searchKey is "byebye"  

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

1. большое спасибо, это сработало, а также короткое решение.

Ответ №2:

Это не красиво, но вот что я придумал:

 var data = {
  songs : { 
    songNames: [
      {holiday:'mp3/01.mp3'}, 
      {loveme:'mp3/02.mp3'}, 
      {byebye:'mp3/03.mp3'}
    ]
  },

  songCheck: ['byebye'],
  foundSong: ""
};

for (var i = 0; i < data.songs.songNames.length; i  )
{
  console.log(data.songs.songNames[i]);

  if (data.songs.songNames[i][data.songCheck[0]] != undefined)
  {
    data.foundSong = data.songs.songNames[i][data.songCheck[0]];
    break;
  }
}

console.log(data.foundSong);
  

У меня нет Audio объекта, поэтому я не мог его использовать, но это незначительное изменение.

Что я бы на самом деле предложил, если у вас есть полномочия / доступ или вы можете убедить тех, у кого они есть, немного изменить структуру данных. Дайте вашему songNames объекту другую структуру, например, фактическому объекту.

 {
  name: "holiday",
  filename: "mp3/01.mp3"
}
  

А затем вернуться songCheck к простой строке. Выполнение обоих этих предложений избавляет от некоторой дополнительной сложности, и вам не нужно полагаться на странное поведение, которое больше похоже на взлом, чем на что-либо еще. Проверка undefined значения при использовании ключа объекта в данном случае не подходит. Например, если кто-то захочет изменить структуру данных позже, вам все равно придется изменить этот код позже, и будет сложнее найти этот код, когда это произойдет.

Если подумать об этом дальше, возможно, в вашем исходном коде имеет смысл сделать это по-своему, но не имеет смысла, если его урезать для этого вопроса, поэтому я думаю, примите этот совет с долей скептицизма.

Кстати, в приведенном выше коде есть некоторая проверка на нуль, которую я пропустил.

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

1. спасибо, это сработало с моей текущей структурой, но не сработало с вашей рекомендуемой структурой. что должно измениться, чтобы использовать { name: «holiday», filename: «mp3 / 01.mp3» }

2. @Fereydoon, измените if (data.songs.songNames[i][data.songCheck[0]] != undefined) на if (data.songs.songNames[i].name === data.songCheck[0]) . Если вы не знаете, как использовать объекты, ознакомьтесь developer.mozilla.org/en-US/docs/Web/JavaScript/Guide /… . Вы также можете сделать его нечувствительным к регистру, используя toLowerCase или toUpperCase . developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…