繁体   English   中英

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

[英]immutable.js: remove an item in a set

所以我有一个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从此集合中删除此相似但不相同的对象的最佳方法是什么?

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

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

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

我可以建议您将Record更改为Map ,将Set更改为List ,然后在使用新事件更新事件List ,可以在其中存储索引引用(尽管Record也可能还不错,但它们也应该是Map )。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM