@progra1337mist

Как изменить код, чтобы в массиве объектов не попадались одинаковые элементы?

<div class="shop">
  <div class="shop_container">
    <div class="shop_name">Store</div>
  </div>
</div>
<div class="shop">
  <div class="shop_container">
    <div class="shop_name">Shop</div>
  </div>
</div>
<div class="shop">
  <div class="shop_container">
    <div class="shop_name">Store</div>
  </div>
</div>
<div class="shop">
  <div class="shop_container">
    <div class="shop_name">Magazin</div>
  </div>
</div>

<div class="shop">
  <div class="shop_container">
    <div class="shop_name">Magazin</div>
  </div>
</div>

var arr = [];
    var shops = document.querySelectorAll('.shop');
    for (var i = 0; i < shops.length; i++) {
        var container = document.querySelectorAll('.shop_container');
        var name = container[i].querySelector('.shop_name');
        let shop =
            {
                name: name.innerHTML,
            }
        ;
        arr.push(shop);
    }
    console.log(arr);

Данный код, выводит в консоль такую запись:
Array(5)
0: {name: "Store"}
1: {name: "Shop"}
2: {name: "Store"}
3: {name: "Magazin"}
4: {name: "Magazin"}
А нужно, чтобы в цикле проходила проверка, которая узнает есть ли в массиве объектов уже объект с таким названием, и если он есть - то цикл сбрасывается и не пушит объект в массив.
И по итогу в консоль должна выводиться такая запись:
Array(3)
0: {name: "Store"}
1: {name: "Shop"}
2: {name: "Magazin"}
Буду очень благодарен за помощь!
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const arr = Array.from(
  new Set(Array.from(document.querySelectorAll('.shop_name'), n => n.innerText)),
  n => ({ name: n })
);

или

const arr = Object.values(Array.prototype.reduce.call(
  document.getElementsByClassName('shop_name'),
  (acc, { textContent: name }) => (acc[name] ??= { name }, acc),
  {}
));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы