是否有更简洁的方式对列表进行排序?

时间:2016-12-07 15:52:09

标签: javascript

我正在使用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]);
                }
            }

2 个答案:

答案 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..