Вернуть один экземпляр повторяющихся значений объекта в JavaScript - PullRequest
0 голосов
/ 04 мая 2018

Я возвращаю информацию из большого API , который содержит повторяющиеся значения объекта. У меня есть массив имен программ и функция, которая находит нужные мне названия. Однако я хочу, чтобы они возвращались только один раз, а не несколько раз.

//...
var data = JSON.parse(request.responseText);
const lateNightHosts = ['The Late Show with Stephen Colbert', 'Conan', 'Jimmy Kimmel Live'];

for (x in data){
  let title = data[x]._embedded.show.name;

  function getShow() 
    if (lateNightHosts.indexOf(title) !== -1){
      console.log(title)
    } 
  }

  getShow()
}

API велик из-за будущих расписаний, поэтому console.log возвращает заголовок несколько раз. Я хотел бы вернуть его один раз. Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Вы можете сделать что-то вроде этого:

var data = JSON.parse(request.responseText);
const lateNightHosts = ['The Late Show with Stephen Colbert', 'Conan', 'Jimmy Kimmel Live'];
const displayed = new Set();

for (x in data){
  let title = data[x]._embedded.show.name;

  function getShow() 
    if (lateNightHosts.indexOf(title) !== -1) {
      if (!displayed.has(title)) {
        console.log(title);
        displayed.add(title);
      }
    } 
  }

  getShow();
}
0 голосов
/ 04 мая 2018

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

let store = new Set();
for (x in data){
  store.add(data[x]._embedded.show.name);
}

Эта новая структура является итеративной, имеет свойство размера и несколько удобных функций-прототипов, таких как has (), delete () и clear ().

let target = document.getElementById('data-target');

let set = new Set();
for(let i = 0; i < 10; i++){
    set.add(`value-${i}`);
}
let elem = '';
set.forEach((value) => {
    elem += `<div>${value}</div>`;
});

target.innerHTML = elem;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

    <div id="data-target"></div>
        
</body>
</html>
0 голосов
/ 04 мая 2018

Вы можете добавить все заголовки в массив и затем отфильтровать его

const lateNightHosts = ['The Late Show with Stephen Colbert', 'Conan', 'Jimmy Kimmel Live', 'The Late Show with Stephen Colbert', 'Conan', 'Jimmy Kimmel Live', 'The Late Show with Stephen Colbert', 'Conan', 'Jimmy Kimmel Live', 'The Late Show with Stephen Colbert', 'Conan', 'Jimmy Kimmel Live'];

filteredArray = lateNightHosts.filter(function(item, pos) {
    return lateNightHosts.indexOf(item) == pos;
})

console.log(filteredArray)

Также вы можете использовать Установить , поскольку он содержит только уникальные элементы, а затем с помощью оператора распространения преобразовать его в массив

const lateNightHosts = ['The Late Show with Stephen Colbert', 'Conan', 'Jimmy Kimmel Live', 'The Late Show with Stephen Colbert', 'Conan', 'Jimmy Kimmel Live', 'The Late Show with Stephen Colbert', 'Conan', 'Jimmy Kimmel Live', 'The Late Show with Stephen Colbert', 'Conan', 'Jimmy Kimmel Live'];

var set = new Set(lateNightHosts);
var filteredArray = [...set];
console.log(filteredArray);
...