Javascript 对象键排序使用 moment.js

Javascript Object key sort using moment.js

我有以下对象结构

{ "Apr-18" : { ... },
  "Jan-18" : { ... },
  "Feb-18" : { ... },
  ...
}

我正在尝试对月份 (MMM-YY) 键进行排序,使其显示如下

{ "Jan-18" : { ... },
  "Feb-18" : { ... },
  "Apr-18" : { ... },
  ...
}

我的代码如下。我正在使用 moment.js 将日期转换为其纪元以进行排序比较。我大致按照此处显示的解决方案 Sort JavaScript object by key 但是它不起作用。

console.log returns 对象原样,未发生排序。我错过了什么?

const object = { 
          "Apr-18" : { "a":"b" },
          "Jan-18" : { "c":"d" },
          "Feb-18" : { "e":"f" }
}

const sortObjectMonths = (obj) => Object.fromEntries(Object.entries(obj).sort( (a, b) => 
     Date.parse(moment(a, "MMM-YY") - Date.parse(moment(b, "MMM-YY")))
));

let sorted = sortObjectMonths(object)
console.log(sorted)

您可以使用 Object.entries() 获取对象 属性 键和值,然后使用 Array.sort() 使用矩对它们进行排序。我们可以简单地减去矩值来对它们进行排序。

Array.sort() 接受两个参数,firstEl、secondEl,在本例中为 [key1, value1]、[key2, value2]。我们可以使用 destructuring 将它们写为 ([a,],[b,]),其中 a 和 b 是对象 keys(例如 'Apr-18') .

然后我们将使用 Object.fromEntries() 来获取我们排序的对象。

const object = { 
    "Apr-18" : { "a":"b" },
    "Jan-18" : { "c":"d" },
    "Feb-18" : { "e":"f" },
}

console.log('Original object:', object)

const sortedObject = Object.fromEntries(
    Object.entries(object).sort(([a,],[b,]) => { 
         return moment(a, "MMM-YY") - moment(b, "MMM-YY");
    })
)
console.log('Sorted object:', sortedObject)
        
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" referrerpolicy="no-referrer"></script>

没有片刻

const months = ["Jan","Feb","Mar","Apr"]

const object = { 
    "Apr-18" : { "a":"b" },
    "Jan-18" : { "c":"d" },
    "Feb-18" : { "e":"f" },
}


const sortedObject = Object.fromEntries(
  Object.entries(object)
    .sort(([a,],[b,]) => months.indexOf(a.split("-")[0]) - months.indexOf(b.split("-")[0]))
)
console.log('Sorted object:', sortedObject)

您的代码几乎没有问题,但在 .sort() 中,元素 a 和 b 都是键和值的数组。键位于索引 0,值位于索引 1。Date.parse() 将不起作用,建议使用 new Date() 转换值。所以,你的代码应该是 -

const moment = require("moment");

const sort = {
  clientname: {
    "Feb-18": { test: "c" },
    "Jan-18": { test: "a" },
    "Apr-18": { test: "v" },
  },
};

const sortObjectMonths = (obj) => {
  return Object.fromEntries(
    Object.entries(obj).sort(
      (a, b) => moment(new Date(a[0])) - moment(new Date(b[0]))
    )
  );
};

let sorted = sortObjectMonths(sort.clientname);
console.log(sorted);