不可变.js:删除集中的项目

immutable.js: remove an item in a set

本文关键字:项目 集中 删除 js 不可变      更新时间:2023-09-26

所以我有一组不可变的.js事件对象。

Set 是 Calendar 对象上的一个属性:

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

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

如果您将事件传递到适当的对象并从我的化简器中的对象构造对象,则向日历添加事件可以正常工作:

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操作。 在当前事件上调用它会在化简器中触发以下内容:

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()调用。

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

您可以使用

Array.prototype.filter手动排除对象。

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

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

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

然后使用Immutable.List.delete将其删除变得非常简单。