sort deep object in javascript
What is the best way to sort this:
{
abc: {
string: 'lorem',
date: 2
},
enc: {
str开发者_开发技巧ing: 'ipsum',
date: 1
}
}
into this:
[{
id: 'enc',
string: 'ipsum',
date: 1
},
{
id: 'abc',
string: 'lorem',
date: 2
}]
I need an array sorted by the date (Number) with a flat object.
First, you need to convert the original object into an array in the format you want:
var arr = [];
for (var key in obj)
if (obj.hasOwnProperty(key)) {
var o = obj[key];
arr.push({ id: key, string: o.string, date: o.date });
}
Then, you can use the array sort
method with a custom comparator for sorting by the date field:
arr.sort(function(obj1, obj2) {
return obj1.date - obj2.date;
});
This will do the trick.
var stuff = {
abc: {
string: 'lorem',
date: 2
},
enc: {
string: 'ipsum',
date: 1
}
};
// Put it into an array
var list = [];
for(var i in stuff) {
if (stuff.hasOwnProperty(i)) {
list.push(stuff[i]);
}
}
// sort the array
list.sort(function(a, b) {
return a.date - b.date;
});
See also:
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference:Global_Objects:Array:sort
I would do it in two steps: First, convert the object to an array:
var array = [],
o;
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
o = obj[key];
o.id = key;
array.push(o);
}
}
Then, sort it like this:
array.sort(function (a, b) {
a.date - b.date;
});
Here's my quick one-liner for this:
let new = Object.entries(obj).map((n) => ({ id: n[0], ...n[1] })).sort(({ date: a }, { date: b }) => a - b)
Let's break it down:
let new = Object.entries(obj); // convert object to [ key, value ] array
new = new.map((n) => ({ id: n[0], ...n[1] }) ); // map array to [ { id: key, ...value } ]
new = new.sort(({ date: a }, { date: b }) => a - b); // sort by date
精彩评论