如何按New_date属性排序含嵌套结构的对象数组?
解决混合对象/数组元素的
New_date排序问题 嘿,这个场景挺常见的——当数组里混着不同类型的元素(普通对象、带自定义属性的数组),但需要统一按New_date排序时,核心就是确保能稳稳拿到每个元素的目标日期值。
先聊聊你的原代码
你的排序逻辑本身没问题,但可能你误以为数组元素的New_date没法直接用.访问?其实在JavaScript里,数组本质是特殊的对象,你给数组加的自定义属性(比如这里的New_date),和普通对象的属性一样能通过element.New_date获取到。不过为了代码更健壮、可读性更高,咱们可以优化一下。
优化后的排序方案
我建议先写个辅助函数专门提取New_date,这样不管元素是对象还是数组,哪怕以后嵌套结构变了,只改这个函数就行:
// 提取元素的New_date值,兼容对象和数组类型 function getTargetDate(element) { // 优先取元素自身的New_date if (element.New_date) { return element.New_date; } // 如果你的嵌套结构更复杂(比如New_date在数组子元素里),可以在这里加逻辑 // 举个例子:如果是数组,检查第一个子对象的New_date(根据你的实际结构调整) // if (Array.isArray(element) && element[0]?.New_date) { // return element[0].New_date; // } // 没找到的话返回默认值(比如最早的日期,避免排序异常) return '1970-01-01'; } // 执行排序 arr.sort(function(a, b) { const dateA = new Date(getTargetDate(a)); const dateB = new Date(getTargetDate(b)); // 保持你原来的降序逻辑 return dateA > dateB ? -1 : dateA < dateB ? 1 : 0; });
针对你的示例数组测试
先把你的示例数组修正成合法的JS语法:
const arr = [ {name:"Angel", data: "random data", New_date: "2020-12-10"}, (() => { const arrItem = [ {name:"Tom", data: "random data"}, {name:"Tom", data: "random data"} ]; arrItem.New_date = "2020-11-10"; return arrItem; })(), {name:"Angel", data: "random data", New_date: "2020-09-10"} ];
用上面的代码排序后,结果会按New_date降序排列:
- 带
2020-12-10的普通对象 - 带
2020-11-10的数组 - 带
2020-09-10的普通对象
几个关键提醒
- 数组的自定义属性:JS数组可以像对象一样加自定义属性,这些属性不会影响数组的长度或遍历,但能正常通过
.访问。 - 扩展性:如果以后嵌套结构变复杂(比如
New_date在对象的深层嵌套里),只需要修改getTargetDate的逻辑,排序主逻辑不用动。 - 日期合法性:如果存在无效的日期字符串,
new Date()会返回Invalid Date,可能导致排序异常,你可以在辅助函数里加个日期合法性校验。
内容的提问来源于stack exchange,提问作者Deividas
相关产品推荐
相关产品推荐

