【问题标题】:Javascript Sort array of objects by value returned by calling methodJavascript按调用方法返回的值对对象数组进行排序
【发布时间】:2020-11-15 07:18:50
【问题描述】:

我有一个包含值和方法的对象数组。其中一种方法返回我想要排序的数量。我还有一些布尔值,它们决定了另一个排序顺序,不管返回的数字是多少。

function reorder(){
    var pinnedTasks = []
    var regularTasks = []
    var finishedTasks = []

    for(var i of tasks){

        if(i.pinned){
            pinnedTasks.push(i)
        } else if(i.done){
            finishedTasks.push(i)
        } else{
            regularTasks.push(i)
        }

    }

}

这会将它们组织成类别,但不会重新排序。我想要一个数组,首先是pinnedTasks,其次是regularTasks,最后是finishedTasks,所有这些都由i.getDueDaysDiff()在自己的部分中重新排序。

具体来说,我希望它通过增加 i.getDueDaysDiff() 的值(最小优先)为正值排序,但减少为负值(最大优先)。例如 [10, -5, -90, 2] 排序应该是 [2, 10, -5, -90]。

例如,如果我有

tasks = [
task: regular, getDueDaysDiff() = 1
task: regular, getDueDaysDiff() = -2
task: regular, getDueDaysDiff() = 12
task: regular, getDueDaysDiff() = -50
task: pinned, getDueDaysDiff() = -10
task: pinned, getDueDaysDiff() = 2
task: finished, getDueDaysDiff() = 5
]

重新排序应该是

tasks = [
task: pinned, getDueDaysDiff() = 2
task: pinned, getDueDaysDiff() = -10
task: regular, getDueDaysDiff() = 1
task: regular, getDueDaysDiff() = 12
task: regular, getDueDaysDiff() = -2
task: regular, getDueDaysDiff() = -50
task: finished, getDueDaysDiff() = 5
]

我应该如何处理这个问题?

【问题讨论】:

  • 您是否尝试过像这样简单地调用数组的sort() 方法? tasks.sort((task1, task2) => ... custom compare function...)?
  • 这能回答你的问题吗? Sort by two values prioritizing on one of them
  • 您想要的结果没有意义:到期日为 diff 12 的常规任务排在到期日为 diff 1 的常规任务之后?
  • @Terry 这是一个待办事项列表之类的事情,所以我首先想要即将发生的事情。 ` 我希望它通过增加 i.getDueDaysDiff() 的值(最小优先)为正值进行排序,但减少为负值(最大优先)。`

标签: javascript arrays sorting object


【解决方案1】:

我想我明白了:

function reorder(){
    var pinnedTasksPos = []
    var pinnedTasksNeg = []
    var regularTasksPos = []
    var regularTasksNeg = []
    var finishedTasksPos = []
    var finishedTasksNeg = []
    
    for (e=0; e<tasks.length; e++){
        let i = tasks[e]
        console.log(i)
        if(i.pinned){
            if(i.dueDaysDiff >= 0) {
                pinnedTasksPos.push(i)
            } else{
                pinnedTasksNeg.push(i)
            }
        } else if(i.done){
            if(i.dueDaysDiff >= 0) {
                finishedTasksPos.push(i)
            } else{
                finishedTasksNeg.push(i)
            }
        } else{
            if(i.dueDaysDiff >= 0) {
                regularTasksPos.push(i)
            } else{
                regularTasksNeg.push(i)
            }
        }
    }

    pinnedTasksPos.sort(compare)
    pinnedTasksNeg.sort(compare).reverse()
    regularTasksPos.sort(compare)
    regularTasksNeg.sort(compare).reverse()
    finishedTasksPos.sort(compare)
    finishedTasksNeg.sort(compare).reverse()

    var newarr = [...pinnedTasksPos, ...pinnedTasksNeg, ...regularTasksPos, ...regularTasksNeg, ...finishedTasksPos, ...finishedTasksNeg]
    return(newarr.reverse())
}

function compare(a, b){
    if(a.dueDaysDiff < b.dueDaysDiff){
        return -1
    }
    if(a.dueDaysDiff > b.dueDaysDiff){
        return 1
    }
    return 0
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2011-11-16
    • 1970-01-01
    相关资源
    最近更新 更多