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);
我有以下对象结构
{ "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);