butteff
@butteff
Раз в тысячу лет заправляю свитер в носки

Как удалить элемент массива в js и сделать его значения уникальными?

Добавляю в массив новый элемент с помощью метода push.
А как удалить элемент, но не последний, с помощью pop, а тот, который содержит нужное значение, например, 17?
Только циклом? Какой метод в цикле применить для удаления?
или есть методы какие, которые удалят сразу по значению без перебора?
Есть ли в js методы, которые делают массив только с уникальными значениями?
  • Вопрос задан
  • 2360 просмотров
Решения вопроса 2
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Array#some(), Array#every(), Array#forEach() и куча других.
Они используют внутри себя цикл, но:
— проходят только по тем элементам, для которых были определены индексы (как и for in)
— не проверяют пользовательские свойства (для чего в for in пришлось бы проверять на hasOwnProperty + на соответствие свойства типу Number)

Так что, при прочих равных, лучше использовать их.

Удаляем первое вхождение
Альтернатива разумному способу, предложенному localghost, — поиск с помощью Array#indexOf()
removeOne(17, [3, 5, 17, 8, 17, 34, 5]);

function removeOne (value, array) {
	array.some(function (_value, index, _array) {
		if (_value == 17) {
			_array.splice(index, 1);
			return true;
		}
	}, array);
	console.log(array);
}

Удаляем каждое вхождение
removeAll(17, [3, 5, 17, 8, 17, 34, 5]);

function removeAll (value, array) {
	array.forEach(function (_value, index, _array) {
		if (_value == 17) {
			_array.splice(index, 1);
		}
	}, array);
	console.log(array);
}

Создаём новый массив с уникальными элементами (или заменяем текущий)
makeUnique([3, 5, 17, 8, 17, 34, 5]);

function makeUnique (array) {
	var newArray = [];

	array.forEach(function (_value, index) {
		if (newArray.indexOf(_value) < 0) {
			newArray.push(_value);
		}
	});
	array = newArray; // По необходимости
	console.log(newArray);
}
Ответ написан
Комментировать
@localghost
>> А как удалить элемент, но не последний, с помощью pop, а тот, который содержит нужное значение, например, 17?
Ну так найти и удалить, нет?
arr.splice(arr.indexOf(17), 1)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Scorpi
@Scorpi
Если и есть такой метод, то внутри него всё равно будет перебор. Это неизбежно.
Ответ написан
Ваш ответ на вопрос

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

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