我想我的问题也可以归结为类似高效Redux的减速,避免不必要的对象副本
是否有地道的ES6办法有:
array.map(identity) === array
?
array.filter(i => true) === array
?
{obj..., attr: obj.attr} === obj
?
我知道,它没有像ES6那样实现,但是有一些我可能缺少的语法或简单的帮助函数使这些属性成为true而不诉诸于不可变的lib吗?
我使用Babel和新的JS功能,具有不可变的js对象。
我想知道如何让我减速更有效率和产生更少的不必要的对象副本
我没有兴趣在一个lib(森/ ImmutableJS)解决方案。
我有一个reducer管理分页列表。
的pages
属性实际上是一个Array[Array[item]]
这里是我的减速器:
const initialState = {
isLoading: false,
pages: [],
allStamplesLoaded: false
};
function reducer(state = initialState, event) {
switch (event.name) {
case Names.STAMPLE_DELETED:
return {
...state,
pages: removeStampleFromPages(state.pages,event.data.stampleId)
};
case Names.STAMPLE_UPDATED:
return {
...state,
pages: updateStampleInPages(state.pages,event.data.apiStample)
};
case Names.STAMPLE_PAGES_CLEANED:
return {
...initialState,
};
case Names.STAMPLE_PAGE_REQUESTED:
return {
...state,
isLoading: true
};
case Names.STAMPLE_PAGE_LOADED:
const {stamplePage,isLastPage} = event.data;
return {
...state,
isLoading: false,
pages: [...state.pages, stamplePage],
isLastPage: isLastPage
};
case Names.STAMPLE_PAGE_ERROR:
return {
...state,
isLoading: false
};
default:
return state;
}
}
我也有这些辅助功能:
function removeStampleFromPages(pages,deletedStampleId) {
return pages.map(page => {
return page.filter(apiStample => apiStample != deletedStampleId)
})
}
function updateStampleInPages(pages,newApiStample) {
return pages.map(page => {
return updateStampleInPage(page,newApiStample);
})
}
function updateStampleInPage(page,newApiStample) {
return page.map(apiStample => {
if (apiStample.id === newApiStample.id) {
return newApiStample;
}
else {
return apiStample;
}
})
}
正如你可以看到,每次一个事件,如STAMPLE_UPDATED
被解雇,然后我的reducer总是返回一个新的状态和一个新的页面数组,即使数组中的项目没有实际更新。这会造成不必要的对象复制和GC。
我不婉过早优化这个也不在我的应用程序引入不可变的库,但我想知道是否有任何地道ES6的方式来解决这个问题?
它以这种方式工作,因为这就是如何定义方法。 ES6不提供替代或任何有用的帮助。 –
您可能过度关注优化吗?你是否尝试过对你的减速器进行基准测试,看看这个过程是否需要很长时间,或者完成内存分析以确定这是否真的是内存问题? – markerikson
我认为这是一个图书馆的利基,完全是这样。 –