仅当值不存在时才使用 lodash 推送到数组?
Using lodash push to an array only if value doesn't exist?
我正在尝试创建一个数组,如果某个值不存在,则添加该数组,但是如果该值存在,我也想从数组中删除该值。
感觉Lodash应该可以做这样的事情。
我对您的最佳实践建议很感兴趣。
另外值得指出的是我使用的是Angular.js
*更新*
if (!_.includes(scope.index, val)) {
scope.index.push(val);
} else {
_.remove(scope.index, val);
}
使用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>
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 是一个很好的做法。它消除了依赖性,迫使您理解您的代码,并且通常性能更高。
也许_.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 ]
这个单衬垫应该可以完成这项工作。如果要插入的元素不存在,它会插入元素和 returns 结果数组的长度。如果元素存在于数组中,它会删除该元素,并且 returns 删除的元素在一个单独的数组中。
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,因为它 returns 生成的数组长度值在大多数情况下是无用的。我更愿意引用要返回的结果数组,以便您可以链接函数。因此,实现它的一种简单方法是;
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>");
所以现在这是可以合理链接的了。
您可以使用_.union
_.union(scope.index, [val]);
如果你不需要支持IE,或者你正在使用polyfills,你可以使用Array.prototype.includes()
const addUniq = (array, value) => array.includes(value)
? array.length
: 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]
最简单的方法是使用 _.isEmpty 和 _.remove Lodash 函数:
if (_.isEmpty(_.remove(array, value)) {
array.push(value);
}
remove函数后会return删除值或一个空数组,如果return一个空数组那么我们会添加一个新值。
这是一个老问题,但你要找的是 XOR Lodash xor
如果该值不存在则添加该值,否则将其删除。非常适合切换 use-cases.
我正在尝试创建一个数组,如果某个值不存在,则添加该数组,但是如果该值存在,我也想从数组中删除该值。
感觉Lodash应该可以做这样的事情。
我对您的最佳实践建议很感兴趣。
另外值得指出的是我使用的是Angular.js
*更新*
if (!_.includes(scope.index, val)) {
scope.index.push(val);
} else {
_.remove(scope.index, val);
}
使用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>
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 是一个很好的做法。它消除了依赖性,迫使您理解您的代码,并且通常性能更高。
也许_.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 ]
这个单衬垫应该可以完成这项工作。如果要插入的元素不存在,它会插入元素和 returns 结果数组的长度。如果元素存在于数组中,它会删除该元素,并且 returns 删除的元素在一个单独的数组中。
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,因为它 returns 生成的数组长度值在大多数情况下是无用的。我更愿意引用要返回的结果数组,以便您可以链接函数。因此,实现它的一种简单方法是;
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>");
所以现在这是可以合理链接的了。
您可以使用_.union
_.union(scope.index, [val]);
如果你不需要支持IE,或者你正在使用polyfills,你可以使用Array.prototype.includes()
const addUniq = (array, value) => array.includes(value)
? array.length
: 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]
最简单的方法是使用 _.isEmpty 和 _.remove Lodash 函数:
if (_.isEmpty(_.remove(array, value)) {
array.push(value);
}
remove函数后会return删除值或一个空数组,如果return一个空数组那么我们会添加一个新值。
这是一个老问题,但你要找的是 XOR Lodash xor
如果该值不存在则添加该值,否则将其删除。非常适合切换 use-cases.