我正在使用ES6和React。我正在通过Java Rest服务中的响应对象进行解析,并且我意识到可能有一种更简洁的方法将对象解析为两个对象。这真是太可怕了,它看起来很笨重。
let draftList = [];
let readyForApprovalList = [];
for (let i = 0; i < action.allStatusesSurveysList.length; i++){
if (action.allStatusesSurveysList[i].status === statusTypes.DRAFT){
draftList.push(action.allStatusesSurveysList[i]);
} else if (action.allStatusesSurveysList[i].status === statusTypes.READY_FOR_APPROVAL){
readyForApprovalList.push(action.allStatusesSurveysList[i]);
}
}
答案 0 :(得分:2)
Array.prototype.filter()
和arrow filter functions的组合将是一个非常干净的解决方案。
请注意,尽管此解决方案很好且易读,但它不是最有效的解决方案,因为它至少需要两次迭代。但是,对于绝大多数用例而言,它可能非常有效,因此可以进行良好的权衡。
const draftList = action.allStatusesSurveysList
.filter(i => i.status === statusTypes.DRAFT)
const readyForApprovalList = action.allStatusesSurveysList
.filter(i => i.status === statusTypes.READY_FOR_APPROVAL)
您甚至可以进一步提取状态过滤功能:
const byStatus = status => item => item.status === status
const draftList = action.allStatusesSurveysList
.filter(byStatus(statusTypes.DRAFT))
const readyForApprovalList = action.allStatusesSurveysList
.filter(byStatus(statusTypes.READY_FOR_APPROVAL))
答案 1 :(得分:1)
forEach
可能在这里工作得更好 - 虽然您可以使用filter
,但每种类别类型都需要一次传递。
action.allStatusesSurveysList.forEach(function(item) {
switch(item.status) {
case statusTypes.DRAFT:
draftList.push(item);
break;
case statusTypes.READY_FOR_APPROVAL:
readyForApprovalList.push(item);
break;
default:
// "unknown status" list??
}
});
这将迭代数组并且使用item
而不是重复放置action.allStatusesSurveysList[i]
。此外,使用switch
语句优于if..else if..