2014-05-14 16 views
1

我試圖寫一個輔助方法來找到這樣兩個散列/對象的交集......爲什麼在擴展Object時coffeescript增加了函數?

Object::intersect = (obj)-> 
    t = {} 
    t[k] = @[k] for k of obj 
    t 

x = { a: 1, b: 2, c: 3 } 
w = { a: true, b: 3 } 
x.intersect(w) #=> { a: 1, b: 2, intersect: [Function] } 

結果如我所料/想除了增加「交叉」鍵/值。

我在這裏錯過了什麼?

+0

如果'W =構造。 – hpaulj

回答

1

您的屬性是可枚舉的,這就是它在迭代時出現在兩個對象中的原因。

一個解決辦法是這樣的:

Object.defineProperty Object.prototype, 'intersect', value:(obj)-> 
    t = {} 
    t[k] = @[k] for k of obj 
    t 

Demonstration(編譯爲JS),你不擁有,特別是Object是可怕的做法,可能會導致其他很多意想不到的問題

但修改對象編碼器。閱讀Maintainable JavaScript: Don’t modify objects you don’t own

這將是一樣容易,因此更清潔簡單地定義一個函數接受兩個對象作爲參數...

+0

我瞭解不修改你不屬於自己的物體。我們的開發小組繼續對此進行辯論。即便如此,我更喜歡a.intersect(b)在相交(a,b)上的語法。爲了支持你關於OYDO的觀點 - 如果我寫了'intersect =(a,b) - > t = {};(t [k] = a [k]爲b);我永遠不會有提出了這個問題。嘆。非常感謝! – Paul

+1

@Paul我希望你最終能夠解決不修改Object,Array等原型的問題。起初感覺很聰明,但實際上並不明智。 –

+0

'defineProperty'有一些瀏覽器兼容性問題。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty – hpaulj

1

添加「ownProperty」檢查消除此intersect財產

Object::intersect= (obj) -> 
    t = {} 
    t[k] = @[k] for own k of obj 
    t 

coffee> x = {a:1, b:2, c:3}; w = {a:true, b:3} 
{ a: true, b: 3 } 
coffee> x.intersect(w) 
{ a: 1, b: 2 } 

如果wkeys不在x中,則它們將以undefined的值顯示在結果中。 {:真,B:3,d:4}`,`然後d:undefined`出現在結果

更健壯的函數可以從underscore

_ = require 'underscore' 
_.pick(x, _.keys(w)) 
+0

在此修復它,但在所有對象上具有枚舉函數的問題將出現在其他位置。 –

相關問題