У меня есть ниже 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 по циклу, поскольку я нахожу этот путь быстрее.

Есть идеи, как заставить это работать?

Заранее спасибо

1
DannyBoy 18 Авг 2019 в 21:42

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. Я предполагаю, что массив не изменится, вам нужно будет синхронизировать карту, если вы собираетесь изменить содержимое массива.

0
Titus 18 Авг 2019 в 19:03

Там нет никакого способа, чтобы не использовать цикл. Если вы хотите быть более эффективным, вы должны использовать императивный цикл с циклом for и разрываться с совпадением.

for(let obj in data) {
  if(obj.title === title)
    // match
    break
}

Надеюсь это поможет.

1
Twigs 18 Авг 2019 в 18:53