Подтвердить что ты не робот

Использование lodash push для массива только в том случае, если значение не существует?

Я пытаюсь сделать массив, если значение не существует, оно добавляется, но если значение есть, я хотел бы удалить это значение из массива.

Похоже, что Lodash должен быть способен сделать что-то вроде этого.

Меня интересуют ваши рекомендации по лучшей практике.

Также стоит отметить, что я использую Angular.js

* Обновление *

if (!_.includes(scope.index, val)) {
    scope.index.push(val);
} else {
  _.remove(scope.index, val);
}
4b9b3361

Ответ 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);
}

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