仅当值不为'不存在
Using lodash push to an array only if value doesn't exist?
我正在尝试创建一个数组,如果不存在值,则添加该值,但如果存在值,我也想从数组中删除该值。
感觉洛达什应该能够做这样的事情。
我对你的最佳实践建议感兴趣。
此外,值得指出的是,我正在使用Angular.js
*更新*
if (!_.includes(scope.index, val)) {
scope.index.push(val);
} else {
_.remove(scope.index, val);
}
您可以使用_.union
_.union(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上使用香草JS是一种很好的做法。它消除了依赖关系,迫使您理解代码,而且通常更具性能。
也许_.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>
在这种情况下,您可以使用"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
这一行应该可以完成这项工作。如果要插入的元素不存在,则插入该元素并返回结果数组的长度。如果数组中存在元素,它将删除该元素,并在单独的数组中返回已删除的元素。
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>");
实际上,我讨厌push,因为它返回的数组长度值在大多数情况下都是无用的。我更希望有一个对要返回的结果数组的引用,以便您可以链接函数。因此,实现这一目标的一个简单方法是:;
var arr = [1,2,3,4,5],
aod = (a,e,i=0) => !!~(i = a.indexOf(e)) ? a.splice(i,1) : (a.push(e),a);
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);
}
remove函数之后将返回removed值或空数组,如果返回空数组,则我们将添加一个新值。
这是一个老问题,但您要寻找的是XOR Lodash XOR
如果不存在,则添加该值,否则删除该值。非常适合切换用例。
- 正在将事件处理程序添加到不存在的类
- javascript如果图像不存在don't加载它
- 由于响应中不存在“Access Control Allow Origin”标头,跨域请求停止工作
- JavaScript-如果以前不存在文本,如何从文本区域删除新行
- 如何将一个函数附加到一个不存在的元素上
- 在scala或scalajs Diode中,现有类型中的任何一种都符合“;更新一个没有'还不存在”;
- 查找数组's按属性不存在于另一个数组中的对象
- 用javascript在对象上创建不存在的方法
- 仅当值不为'不存在
- casperjs-css选择器存在,但当单击它时会引发“”;CasperError:无法在不存在的选择器“”上调度mou
- 运行时不存在Javascript函数
- 使用webdriver和selenium验证元素是否不存在
- 如果文件不存在,fs.watch是否有错误处理程序
- 试图把注意力集中在一个不重要的元素上是不是一种糟糕的做法;不存在
- Backbonejs:在视图中渲染的模型,但在集合中不存在
- 从params推送到对象(如果不存在)
- 当锚点HREF源不存在时隐藏图像
- 如何从网站获得apple touch图标,如果没有;不存在,则显示收藏夹
- 什么是 ClojureScript 类似地将不存在的对象值设置为 JavaScript 中的 null
- 如果 document.title 不存在,如何获取页面标题名称