#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 /…