按对象值对对象字典进行排序

时间:2017-11-24 19:45:34

标签: javascript sorting object lodash

如果我有这样的JavaScript对象:

list = {
    John: {
        DOB: '2017-02-01'
    },
    Rob: {
        DOB: '2016-07-09'
    },
}

如何将此对象排序为按DOB排序的对象列表。我安装了lodash,因此使用它是一种选择。

我希望结果是可映射的,即一个数组,如:

sorted_keys = ['Rob','John']

sorted_array = [
    {
        Rob: {
            DOB: '2016-07-09'   
        }
    },
    {
        John: {
            DOB: '2017-02-01'   
        }
    },
]

2 个答案:

答案 0 :(得分:3)

var list = {
    John: {
        DOB: '2017-02-01'
    },
    Rob: {
        DOB: '2016-07-09'
    }
}

var sortedKeys = Object.keys(list).sort(function(a, b) {
  return new Date(list[a].DOB) - new Date(list[b].DOB)
})

console.log(sortedKeys)

或使用箭头功能:

let list = {
    John: {
        DOB: '2017-02-01'
    },
    Rob: {
        DOB: '2016-07-09'
    }
}

let sortedKeys = Object.keys(list).sort((a, b) => new Date(list[a].DOB) - new Date(list[b].DOB))

console.log(sortedKeys)

如果有字符串,请回答您的评论:

let list = {
    John: {
        DOB: 'bbb'
    },
    Rob: {
        DOB: 'aaa'
    }
}

let sortedKeys = Object.keys(list).sort((a, b) => {
    if(list[a].DOB < list[b].DOB) return -1;
    if(list[a].DOB > list[b].DOB) return 1;
    return 0;
})

console.log(sortedKeys)

答案 1 :(得分:1)

首先,请注意,有一个名为list的对象不是列表而是对象,这有点奇怪。

可以按照以下步骤对此对象中的键值对进行排序:

  • 使用Object.keys
  • 解压缩密钥
  • list[key].DOB值的字母顺序对键进行排序。幸运的是,您可以使用localeCompare来比较YYYY-MM-DD格式的日期。
  • 将排序的键映射到所需最终结构的对象

像这样:

let sorted = Object.keys(list)
  .sort((a, b) => list[a].DOB.localeCompare(list[b].DOB))
  .map(k => { return { [k]: list[k] } }));

结果:

[
  {
    "Rob": {
      "DOB": "2016-07-09"
    }
  },
  {
    "John": {
      "DOB": "2017-02-01"
    }
  }
]