2017-08-15 95 views
0

上下文有沒有一種簡單的方法來快速將給定數組的所有內容傳遞給`Array.prototype`方法變量而不使用參數?

我創建陣列docket跟蹤座標作爲用戶點擊畫布空間。在主程序循環期間,陣列將被繪圖功能掃描,以便可以看到選定的像素。最初,在我的事件監聽器中,我使用了push()方法,但後來我意識到我想要一種切換像素的方法。

碼描述

所以我添加的方法poke()Array.prototype,如下面看到的那樣,這使我到整個docket陣列推入一個本地陣列param.array並分配觸發座標到一個局部變量param.entryentry然後被推入arrayarray由主要的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.arrayparam.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; 
    } 
    } 
} 

正如你所看到的,這消除了在呼叫的冗餘,但它犧牲的方法,更重要的一些可讀性的機會,真的渺茫了使用簡單的比較,我上面提到的代碼。

所以現在我想知道是否有一些不太明顯的方式,我已經錯過了,這將允許我將我的數組的全部內容傳遞給局部變量,而不必先傳遞它們作爲參數它自己的方法。

任何想法?

+1

爲什麼所有的本地對象?你有什麼反對原始的東西? – trincot

+0

我認爲這有助於我保持組織。我以bool對象爲例。我的意思是當你檢查for循環條件區域時,看到變量bool附在變量上,它使得我更容易看到我腦海中發生了什麼。儘管我在學習,但我的實踐正在不斷轉變。 – Musixauce3000

+1

「可以訪問我的數組的內容,而不必將它們作爲它自己的方法的參數傳遞給它們」 - 聽起來這個「*」恰恰是*剛剛描述的內容。我不清楚爲什麼你認爲它「降低了可讀性」。 'this'的意思是「將這個函數作爲一個方法調用時使用的對象」,所以就可讀性而言,這正是你想要做的事情,而這正是本文要表達的意思。我還第二個想法是,使用'i'和'bool'變量來不必要地「命名空間」你的本地變量是相當混亂和損害你的代碼的可讀性。 – apsillers

回答

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

注:我個人發現名稱togglepoke更有說服力。

也考慮一下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());

+0

這看起來不錯。當我下班時我會嘗試其中的一些,並讓你知道它是如何發生的。 – Musixauce3000

+0

尚未測試'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

+0

不客氣。事實上,一個Set提供了常量'has','get'和'set'方法。注意:爲什麼不立即調用參數'value'而不是將'a'分配給'value'?此外,'return array;'不必出現兩次,只需將它放在'if ... else'塊之後即可。 – trincot

相關問題