0

此代碼是否可以重構爲更多功能/下劃線樣式,主要是檢查addedEventsactualEvents中存在的部分?如何用underscore.js重構這個數組比較?

describe 'when removing', -> 

    it 'should remove all bound events from the window', -> 
    @view.remove() 
    addedEvents = ['dragenter', 'drop', 'dragleave', 'register'] 
    actualEvents = _.keys $._data(window, 'events') #=> ['onload', 'drop', 'etc.'] 
    for event in addedEvents 
     present = _.contains(actualEvents, event) 
     expect(present).toBe(false) 

回答

1

也許用咖啡的後綴forin操作可以使代碼更易讀:

addedEvents = ['dragenter', 'drop', 'dragleave', 'register'] 
actualEvents = _.keys $._data(window, 'events') #=> ['onload', 'drop', 'etc.'] 
expect(event not in actualEvents).toBe(true) for event in addedEvents 

如果你使用Jasmine作爲你的測試庫,你可以使用我認爲更易讀的toContain :)

expect(actualEvents).not.toContain(event) for event in addedEvents 

最後,如果你想要去用下劃線更具功能性的風格,你可以認爲這種說法是檢查沒有addedEvents的存在於actualEvents,換句話說,即這兩個的intersection陣列是空的:

expect(_.intersection(actualEvents, addedEvents).length).toBe(0) 
+0

最後一個正是我要找的,謝謝! – meleyal

1

如果您特別希望它使用下劃線功能,那麼應該做以下事情。

addedEvents = ['dragenter', 'drop', 'dragleave', 'register'] 
actualEvents = _.keys $._data(window, 'events') 
present = _.reduce addedEvents, ((prev, current) -> 
    prev or _.contains actualEvents, current 
), false) 
expect(present).toBe false 

當然,你可以做到這一點,沒有下劃線,但它需要ES5功能:

addedEvents = ['dragenter', 'drop', 'dragleave', 'register'] 
actualEvents = Object.keys $._data(window, 'events') 
present = addedEvents.reduce, ((prev, current) -> 
    prev or actualEvents.indexOf(current) > -1 
), false) 
expect(present).toBe false