有没有一种简单的方法来快速将给定数组的所有内容传递给`Array.prototype`方法变量而不使用参数?
上下文有没有一种简单的方法来快速将给定数组的所有内容传递给`Array.prototype`方法变量而不使用参数?
我创建阵列docket
跟踪坐标作为用户点击画布空间。在主程序循环期间,阵列将被绘图功能扫描,以便可以看到选定的像素。最初,在我的事件监听器中,我使用了push()
方法,但后来我意识到我想要一种切换像素的方法。
码描述
所以我添加的方法poke()
到Array.prototype
,如下面看到的那样,这使我到整个docket
阵列推入一个本地阵列param.array
并分配触发坐标到一个局部变量param.entry
。 entry
然后被推入array
,array
由主要的poke()
循环处理,以确保没有重复的值。如果发现匹配,则两个元素都被歼灭并且param.array
返回顶部,最终将docket
缩小1;如果没有找到匹配,则没有任何元素被消灭和param.array
返回到顶部,最终由1
主要问题扩大docket
:例如1
无论如何,该方法目前正在写的,它必须被称为:
docket.poke(docket, e.key);
注意:为了简单起见,我使用了键盘键值。
Array.prototype.poke = function(a, b) {
var bool = { }, i = { }, param = { };
param.array = a; param.entry = b;
//
param.array.push(param.entry);
i.len = param.array.length;
i.end = i.len - 1;
//
for (i.cur = 0; i.cur < i.len; i.cur++) {
bool.match = param.array[ i.cur ] == param.array[ i.end ];
bool.nSelf = !(i.cur == i.end);
//
if (bool.match && bool.nSelf) {
param.array.splice(i.end, 1);
param.array.splice(i.cur, 1);
//
i.end -= 2;
i.len -= 2;
}
}
//
return param.array;
}
这似乎有点多余,但它提供了两个关键优势。首先要可读性和审美。能够明显地将docket
的内容传递给本地数组进行处理,然后将结果明显地返回到顶端,我认为这对理解非常有帮助。其次,这个例子和下一个例子都使用了一种令人困惑的真理测试来过滤重复值检测中的误报。这个例子没有太多。它可以很容易地被重写,比较param.array
到param.entry
中的每个元素,使用紧密的,没有废话的循环。
主要问题:例如2
docket.poke(e.key);
是较少冗余和更期望的方法。这是我的代码。
Array.prototype.poke = function(a) {
var bool = { }, entry = a, i = { };
//
this.push(entry);
i.len = this.length;
i.end = i.len - 1;
//
for (i.cur = 0; i.cur < i.len; i.cur++) {
bool.match = this[ i.cur ] == this[ i.end ];
bool.nSelf = !(i.cur == i.end);
//
if (bool.match && bool.nSelf) {
this.splice(i.end, 1);
this.splice(i.cur, 1);
//
i.end -= 2;
i.len -= 2;
}
}
}
正如你所看到的,这消除了在呼叫的冗余,但它牺牲的方法,更重要的一些可读性的机会,真的渺茫了使用简单的比较,我上面提到的代码。
所以现在我想知道是否有一些不太明显的方式,我已经错过了,这将允许我将我的数组的全部内容传递给局部变量,而不必先传递它们作为参数它自己的方法。
任何想法?
如果要将数组作为参数传递,没有理由在原型上定义该方法。一个普通的函数将会很好。
代码的第二个版本确实具有可以将该方法应用于给定数组而不是将该数组传递给函数的优点。
如果该代码可以然而被简化:
- 你会只有你已经确定它尚未出现在阵列中
- 你会使用后添加的元素
indexOf
:
Array.prototype.toggle = function(value) {
var index = this.indexOf(value);
if (index > -1) {
this.splice(index, 1);
} else {
this.push(value);
}
}
var a = [4,2,5,8];
a.toggle(2);
console.log(a.join());
a.toggle(2);
console.log(a.join());
注:我个人发现名称toggle
比poke
更有说服力。
也考虑一下Set
的威力:它会在常量时间内找到一个现有的成员(而数组实现需要线性时间),并且能够在一段时间内将其删除。所以如果你愿意使用其他的东西而不是数组,那就去Set
。
Set.prototype.toggle = function(value) {
if (!this.delete(value)) this.add(value);
}
var a = new Set([4,2,5,8]);
a.toggle(2);
console.log([...a].join());
a.toggle(2);
console.log([...a].join());
这看起来不错。当我下班时我会尝试其中的一些,并让你知道它是如何发生的。 – Musixauce3000
尚未测试'Set'。你说这个例程会花费相同的时间,不管这个集合有多大?整齐!无论如何,我按照你所建议的那样使用'indexOf()',并且像'apsillers'一样用'this'导入了数组(尽管我确信我试过了)。这是我的新代码。 'Array.prototype.poke = function(a){0} {0} {0}} var array = this,value = a; \t var bool = {},i = {}; \t i.match = array.indexOf(value); \t bool.match = i.match> = 0; if(bool.match){ \t \t array.splice(i。匹配,1); \t \t return array; \t} \t else { \t \t array.push(value); \t \t return array; ',谢谢! – Musixauce3000
不客气。事实上,一个Set提供了常量'has','get'和'set'方法。注意:为什么不立即调用参数'value'而不是将'a'分配给'value'?此外,'return array;'不必出现两次,只需将它放在'if ... else'块之后即可。 – trincot
为什么所有的本地对象?你有什么反对原始的东西? – trincot
我认为这有助于我保持组织。我以bool对象为例。我的意思是当你检查for循环条件区域时,看到变量bool附在变量上,它使得我更容易看到我脑海中发生了什么。尽管我在学习,但我的实践正在不断转变。 – Musixauce3000
“可以访问我的数组的内容,而不必将它们作为它自己的方法的参数传递给它们” - 听起来这个“*”恰恰是*刚刚描述的内容。我不清楚为什么你认为它“降低了可读性”。 'this'的意思是“将这个函数作为一个方法调用时使用的对象”,所以就可读性而言,这正是你想要做的事情,而这正是本文要表达的意思。我还第二个想法是,使用'i'和'bool'变量来不必要地“命名空间”你的本地变量是相当混乱和损害你的代码的可读性。 – apsillers