У меня есть ниже JSON и в каждом объекте есть художник и значения изображения. Мне нужен механизм, который, когда я даю имя художнику, возвращает значение изображения в том же объекте. Все объекты деформированы в массив как JSON.
var iTunes_data = $([{
"title": "title1",
"image": "images/image1.jpg"
},
{
"title": "Hotel California [Rainwave Chiptunes]",
"image": "images/image2.jpg"
},
{
"title": "The Multi-Story Car Park [Rainwave Chiptunes]",
"image": "images/image3.jpg"
},
{
"title": "title4",
"image": "images/image4.jpg"
},
{
"title": "title5",
"image": "images/image2.jpg"
}
]);
function getImage(currentTitle) {
let url = iTunes_data.filter(element => element.title === currentTitle);
return url[0].image;
}
console.log(getImage("title5"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Поэтому, когда я спрашиваю title5
, я хочу получить images/image2.jpg
.
Я не хочу использовать любой цикл. Это должно быть больше, находя ключ и получая значение, а не проходя через JSON по циклу, поскольку я нахожу этот путь быстрее.
Есть идеи, как заставить это работать?
Заранее спасибо
2 ответа
Чтобы получить конкретный элемент из массива без зацикливания, вам нужно знать его индекс. Лучшее, что вы можете сделать, - это сделать цикл только один раз, чтобы сопоставить каждый заголовок с индексом элемента в массиве, вот пример:
const arr = [{
"title": "title1",
"image": "images/image1.jpg"
},
{
"title": "Hotel California [Rainwave Chiptunes]",
"image": "images/image2.jpg"
},
{
"title": "The Multi-Story Car Park [Rainwave Chiptunes]",
"image": "images/image3.jpg"
},
{
"title": "title4",
"image": "images/image4.jpg"
},
{
"title": "title5",
"image": "images/image2.jpg"
}]
const map = arr.reduce((a, c, index) => {
a[c.title] = index;
return a;
},{});
function getImage(title) {
if (!isNaN(map[title])) {
return arr[map[title]].image;
}
}
console.log(getImage('title5'));
В этом примере я использовал обычный массив вместо объекта jQuery. Я предполагаю, что массив не изменится, вам нужно будет синхронизировать карту, если вы собираетесь изменить содержимое массива.
Там нет никакого способа, чтобы не использовать цикл. Если вы хотите быть более эффективным, вы должны использовать императивный цикл с циклом for и разрываться с совпадением.
for(let obj in data) {
if(obj.title === title)
// match
break
}
Надеюсь это поможет.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.