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