仅当值不存在时才使用lodash push到数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅当值不存在时才使用lodash push到数组?相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个数组,如果一个值不存在则添加但是如果值在那里我也想从数组中删除该值。

像Lodash这样的感觉应该可以做这样的事情。

我对您的最佳实践建议感兴趣。

值得指出的是我使用的是Angular.js

*更新*

if (!_.includes(scope.index, val)) 
    scope.index.push(val);
 else 
  _.remove(scope.index, val);

答案

ES6引入的Set功能就是这样做的。

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);
  

在Lodash上使用vanilla JS是一个很好的做法。它消除了依赖关系,迫使您理解您的代码,并且通常更具性能。

另一答案

你可以使用_.union

_.union(scope.index, [val]);
另一答案

也许_.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 ]
另一答案

使用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>
另一答案

这个单衬里应该做的工作。如果要插入的元素不存在,则插入元素并返回结果数组的长度。如果数组中存在元素,则删除该元素并将已删除的元素返回到单独的数组中。

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>");
另一答案

如果您不需要支持IE,或者您正在使用polyfill,则可以使用Array.prototype.includes()

const addUniq = (array, value) => array.includes(value) 
  ? array.length 
  : array.push(value);
另一答案

最简单的方法是使用_.isEmpty和_.remove Lodash函数:

if (_.isEmpty(_.remove(array, value)) 
   array.push(value);

删除函数后将返回删除的值或空数组,如果返回一个空数组,则我们将添加一个新值。

另一答案

在这种情况下,您可以使用'concat'来推送'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

以上是关于仅当值不存在时才使用lodash push到数组?的主要内容,如果未能解决你的问题,请参考以下文章

仅当值不存在时才返回行

sql Oracle:仅当值存在时才从另一个表中插入值

Spring - 仅当值不为空时才设置属性

FluentValidation - 仅当值不为空时检查值是表达式

仅当值不同时才更新 HBase 表

Postgres UPSERT (INSERT 或 UPDATE) 仅当值不同时