Использование lodash push для массива только в том случае, если значение не существует?
Я пытаюсь сделать массив, если значение не существует, оно добавляется, но если значение есть, я хотел бы удалить это значение из массива.
Похоже, что Lodash должен быть способен сделать что-то вроде этого.
Меня интересуют ваши рекомендации по лучшей практике.
Также стоит отметить, что я использую Angular.js
* Обновление *
if (!_.includes(scope.index, val)) {
scope.index.push(val);
} else {
_.remove(scope.index, val);
}
Ответы
Ответ 1
Функция Set
, введенная ES6, будет делать именно это.
var s = new Set();
// Adding alues
s.add('hello');
s.add('world');
s.add('hello'); // already exists
// Removing values
s.delete('world');
var array = Array.from(s);
Или если вы хотите продолжать использовать обычные массивы
function add(array, value) {
if (array.indexOf(value) === -1) {
array.push(value);
}
}
function remove(array, value) {
var index = array.indexOf(value);
if (index !== -1) {
array.splice(index, 1);
}
}
Использование ванили JS над Lodash - хорошая практика. Он удаляет зависимость, заставляет вас понимать ваш код и часто более эффективен.
Ответ 2
Вы можете использовать _.union
_.union(scope.index, [val]);
Ответ 3
Возможно, _.pull() может помочь:
var _ = require('lodash');
function knock(arr,val){
if(arr.length === _.pull(arr,val).length){
arr.push(val);
}
return arr;
}
Изменяет существующий массив, а также удаляет дубликаты:
> var arr = [1,2,3,4,4,5];
> knock(arr,4);
[ 1, 2, 3, 5 ]
> knock(arr,6);
[ 1, 2, 3, 5, 6 ]
> knock(arr,6);
[ 1, 2, 3, 5 ]
Ответ 4
Используйте функцию includes
, чтобы проверить, что элемент существует в массиве, и remove
для удаления существующего элемента.
function addOrRemove(arr, val) {
if (!_.includes(arr, val)) {
arr.push(val);
} else {
_.remove(arr, item => item === val);
}
console.log(arr);
}
var arr = [1, 2, 3];
addOrRemove(arr, 1); // arr = [2, 3]
addOrRemove(arr, 4); // arr = [2, 3, 4]
addOrRemove(arr, 2); // arr = [3, 4]
<script src="https://raw.githubusercontent.com/lodash/lodash/4.11.2/dist/lodash.min.js"></script>
Ответ 5
Этот одиночный лайнер должен выполнить эту работу. Если элемент, который нужно вставить, не существует, он вставляет элемент и возвращает длину результирующего массива. Если элемент существует в массиве, он удаляет элемент и возвращает удаленный элемент в отдельный массив.
var arr = [1,2,3,4,5],
aod = (a,e,i=0) => !!~(i = a.indexOf(e)) ? a.splice(i,1) : a.push(e);
document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>");
document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>");
Ответ 6
Если вам не нужно поддерживать IE или если вы используете полифилы, вы можете использовать Array.prototype.include()
const addUniq = (array, value) => array.includes(value)
? array.length
: array.push(value);
Ответ 7
В этом случае вы можете использовать ' concat
' для push и ' uniq
' для проверки уникальных значений:
пример:
var ar = [1, 2, 3, 1, 5, 2, 4]
ar = _.uniq(_.concat(ar, 9))
//[1, 2, 3, 5, 4, 9]
например: https://codepen.io/dieterich/pen/xeZNJY
ссылка: https://lodash.com/docs/4.17.11#uniq
Ответ 8
Самый простой способ сделать это - использовать функции _.isEmpty и _.remove Lodash:
if (_.isEmpty(_.remove(array, value)) {
array.push(value);
}
После удаления функция будет возвращать удаленные значения или пустой массив, а если вернет пустой массив, то мы добавим новое значение.