@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"}
Буду очень благодарен за помощь!
  • Вопрос задан
  • 193 просмотра
Решения вопроса 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),
  {}
));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
22 нояб. 2024, в 08:04
1 руб./за проект
22 нояб. 2024, в 06:06
1500 руб./в час
22 нояб. 2024, в 06:04
1 руб./за проект