下面是我为这个简单任务编写的javascript代码:
如果元素存在于数组中,则对其执行
如果元素不在数组中,则使用
if(_.contains(this.types,type_id)){ var index = this.types.indexOf(type_id);this.types.splice(index,1);} else{ this.types.push(type_id);}
有没有更有效的方法来做到这一点?
发布于 2013-06-18 01:45:27
如果你关心效率,那么使用一个数组来实现一个集合可能不是一个好主意。例如,使用一个你可以做的对象:
function toggle(S, x) {
S[x] = 1 - (S[x]|0);
}
然后,在多次添加/删除操作之后,您只能保留值为1的键
这样,每次添加/删除都是O(1)
的,您只需执行一次O(n)
操作即可获得最终结果。
如果密钥都是“小”数字,则位掩码甚至值得努力(未测试)
function toggle(S, x) {
var i = x >> 4;
S[i] = (S[i]|0) ^ (1<<(x&15));
}
发布于 2013-06-18 01:36:09
你可以在没有第三方库的情况下做到这一点,这样会更有效率。(这只会删除找到的值的第一个实例,而不是多个)
Javascript
var a = [0, 1, 2, 3, 4, 6, 7, 8, 9],
b = 5,
c = 6;
function addOrRemove(array, value) {
var index = array.indexOf(value);
if (index === -1) {
array.push(value);
} else {
array.splice(index, 1);
}
}
console.log(a);
addOrRemove(a, b);
console.log(a);
addOrRemove(a, c);
console.log(a);
输出
[0, 1, 2, 3, 4, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 6, 7, 8, 9, 5]
[0, 1, 2, 3, 4, 7, 8, 9, 5]
在jsfiddle上
发布于 2016-10-20 17:15:54
您可以使用lodash函数"xor":
_.xor([2, 1], [2, 3]);
// => [1, 3]
如果没有数组作为第二个参数,可以简单地将变量包装到一个数组中
var variableToInsertOrRemove = 2;
_.xor([2, 1], [variableToInsertOrRemove]);
// => [1]
_.xor([1, 3], [variableToInsertOrRemove]);
// => [1, 2, 3]
https://stackoverflow.com/questions/17153238
复制相似问题