Удалить значение из массива в Underscore

Почему в суперчерке нет супер простой функции remove?

var arr = [1,2,3,4,5];
_.remove(arr, 5);

Конечно, я мог бы использовать reject или without... но ни один из них не является разрушительным. Я что-то пропустил?

Думаю, я сделаю это старомодным способом...

arr.splice(arr.indexOf(5), 1);

тьфу

Ответ 1

Объяснение

Это связано с тем, что Underscore предоставляет функциональные концепции JavaScript, и одна из ключевых концепций функционального программирования Referential Transparency.

По сути, функции не имеют побочных эффектов и всегда будут возвращать один и тот же результат для данного входа. Другими словами, все функции pure.

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

Решение

Правильный способ удаления значений из массива в Underscore уже подробно обсуждался в Qaru здесь. В качестве примечания, при использовании without, reject или filter, если вы хотите удалить только один экземпляр элемента из массива, вам нужно будет однозначно идентифицировать его. Итак, следующим образом:

arr = _.without(arr, 5);

вы удалите все экземпляры 5 из arr.