【问题标题】:immutable.js: remove an item in a setimmutable.js:删除集合中的一个项目
【发布时间】:2016-02-02 10:16:28
【问题描述】:

所以我有一组 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,
    }

但是,它不是 exact 相同的对象,我猜这会导致.delete() 调用失败。

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

【问题讨论】:

    标签: javascript redux immutable.js


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多