@Smirator

Как узнать, есть ли уже в массиве такой элемент?

Не могу определить, есть ли в массиве элемент, который я добавляю. Сложность заключается в том, что изначально массив пустой. Его наполняет пользователь и нужно при наличии двух одинаковых элементов в массиве показывать предупреждение.
Я пытался использовать includes, indexOf, find. Возможно, я использовал их неправильно или они не подходят под мою задачу.

Данное решение является самым рабочим, но если одинаковые элементы находятся далеко друг от друга, то оно не работает. Элементы в массиве - это объекты.

for (let i = 0; i < arrDeletedValue.length; i++) {
			for (let j = i + 1; j < arrDeletedValue.length; j++) {

				if (arrDeletedValue[i]['amountAperture'] == arrDeletedValue[j]['amountAperture'] && arrDeletedValue[i]['heightAperture'] == arrDeletedValue[j]['heightAperture'] && arrDeletedValue[i]['widthAperture'] == arrDeletedValue[j]['widthAperture']) {
					notification.innerHTML = 'Обратите внимание, у вас есть одинаковые размеры';
				} else {
					notification.innerHTML = '';
				}

			}
		}
  • Вопрос задан
  • 238 просмотров
Решения вопроса 2
wapster92
@wapster92 Куратор тега JavaScript
const arr = [];

const addObj = (obj) => {
  if(!arr.length) {
    arr.push(obj); 
    console.log(arr);
    return;
  }
  if(arr.some(n => n.width === obj.width && n.height === obj.height)) {
    console.log('Такой элемент уже существует');
  } else {
    arr.push(obj);
    console.log(arr);
  }
}

addObj({width: 5, height: 2});
addObj({width: 1, height: 3});
addObj({width: 5, height: 2}); // "Такой элемент уже существует"
Ответ написан
VoidVolker
@VoidVolker Куратор тега JavaScript
Dark side eye. А у нас печеньки! А у вас?
Проверять массив на наличие объекта надо до того, как этот объект добавлять в массив. Для этого используется
Array.some(). Пример:
var arr = [ {a: 5}, {a: 12}, {a: 8}, {a: 130}, {a: 44}]
var isObjectInArr = arr.some(el => el.a === 12)
console.log('Is object in array:', isObjectInArr)


А если делать совсем правильно, то можно сделать, например, вот так:
class MyObject {
    constructor(prop1, prop2) {
        this.prop1 = prop1
        this.prop2 = prop2
    }

    isEqual(b) {
        return MyObject.isEqual(this, b)
    }

    static includes(arr, a) {
        return arr.some((b) => MyObject.isEqual(a, b))
    }

    static isEqual(a, b) {
        return a.prop1 === b.prop1 & a.prop2 === b.prop2
    }
}

var arr = [
    new MyObject(5, 6),
    new MyObject(12, 13),
    new MyObject(8, 9),
    new MyObject(130, 131),
    new MyObject(44, 45)
]
var object = new MyObject(12, 13)
var isObjectInArr = MyObject.includes(arr, object)
console.log('Is object in array:', isObjectInArr)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы