immutable.js:删除集合中的项目

时间:2016-02-02 10:16:28

标签: javascript redux immutable.js

所以我有一个immutable.js事件对象集。

Set是Calendar对象的属性:

const Calendar = new Record({
    'events': new Set(), // set of Events
});

我正在使用Redux,并启动操作以添加和删除Calendar中的事件:

如果将事件传递给适当的对象并从我的reducer中的那些构造对象,

将事件添加到日历中可以正常工作:

case ADD_EVENT_TO_CURRENT_CALENDAR:
    return state.updateIn(['events'], (events)=> events.add({
        start: action.event.date,
        end: action.event.date,
        title: `${action.event.show.venue}`,
        show: action.event.show,
        boundActions: action.boundActions,
    }));

活动中的boundActions之一是removeEventFromCurrentCalendar操作。在当前事件上调用它会在reducer中触发以下内容:

case REMOVE_EVENT_FROM_CURRENT_CALENDAR:
    return state.updateIn(['events'], (events)=> {
        events.delete(action.event);
    });

action.event相当于ADD_EVENT...中指定格式的当前事件,即:

    {
        start,
        end,
        title,
        show,
        boundActions,
    }

但是,它不是完全相同的对象,这正是我猜测正在绊倒.delete()调用。

使用immutable.js从此集合中删除此类似但不相同的对象的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

您可以使用Array.prototype.filter手动排除对象。

arr.filter((item) => {
    return item.start !== toDelete.start &&
        item.end !== toDelete.start && ...etc
})

FWIW,如果数组中的每个项目都保留唯一ID,则更容易过滤。然后,您只需要比较单个值而不是对象结构。

答案 1 :(得分:0)

我是否可以建议您将Record更改为Map,将Set更改为List,然后在使用新事件更新事件List时,您可以在其中存储索引引用(这些也应该是Map,尽管Record也可能很好。)

稍后使用Immutable.List.delete删除它会变得非常简单。