Это довольно простая задача.Просто сравните годы, если они совпадают, то сравните имена.
var features = [
{ Project_Name : 'C', properties : { Project_Year : new Date(2019, 1, 0) } },
{ Project_Name : 'A', properties : { Project_Year : new Date(2019, 1, 0) } },
{ Project_Name : 'B', properties : { Project_Year : new Date(2019, 1, 0) } },
{ Project_Name : 'C', properties : { Project_Year : new Date(2018, 1, 0) } },
{ Project_Name : 'A', properties : { Project_Year : new Date(2017, 1, 0) } },
{ Project_Name : 'B', properties : { Project_Year : new Date(2018, 1, 0) } }
];
/** Sort by year, followed by name */
var sortedFeatures = features.sort(function(a, b) {
var yearDiff = a.properties.Project_Year - b.properties.Project_Year;
if (yearDiff === 0) {
return a.Project_Name.localeCompare(b.Project_Name);
}
return yearDiff;
});
console.log(sortedFeatures);
.as-console-wrapper { top: 0; max-height: 100% !important; }
Динамический подход
Если вы хотите более общую реализацию, вы можете проверить этот пример .Я создал расширенную реализацию этого примера, которая запрашивает область вложенных свойств.
var sort_by;
(function() {
var default_cmp = (a, b) => a == b ? 0 : (a < b ? -1 : 1);
getCmpFunc = (primer, reverse) => {
let dfc = default_cmp, cmp = default_cmp;
if (primer) {
cmp = (a, b) => dfc(primer(a), primer(b));
}
if (reverse) {
return (a, b) => -1 * cmp(a, b);
}
return cmp;
};
queryValue = function(v, scope) {
return scope == null || scope.length === 0 ? v : queryValue(v[scope.shift()], scope);
};
sort_by = function() {
let fields = [], n_fields = arguments.length, field, name, reverse, cmp;
for (var i = 0; i < n_fields; i++) {
field = arguments[i];
if (typeof field === 'string') {
name = field;
cmp = default_cmp;
} else {
name = field.name;
cmp = getCmpFunc(field.primer, field.reverse);
}
fields.push({ name: name, cmp: cmp });
}
return (A, B) => {
let a, b, result;
for (var i = 0; i < n_fields; i++) {
result = 0;
a = queryValue(A, fields[i].name.split('.'));
b = queryValue(B, fields[i].name.split('.'));
result = fields[i].cmp(a, b);
if (result !== 0) break;
}
return result;
};
};
}());
var features = [
{ Project_Name : 'C', properties : { Project_Year : new Date(2019, 1, 0) } },
{ Project_Name : 'A', properties : { Project_Year : new Date(2019, 1, 0) } },
{ Project_Name : 'B', properties : { Project_Year : new Date(2019, 1, 0) } },
{ Project_Name : 'C', properties : { Project_Year : new Date(2018, 1, 0) } },
{ Project_Name : 'A', properties : { Project_Year : new Date(2017, 1, 0) } },
{ Project_Name : 'B', properties : { Project_Year : new Date(2018, 1, 0) } }
];
/** Sort by year (decending), followed by name (ascending) */
var sortedFeatures = features.sort(sort_by(
{ name: 'properties.Project_Year', reverse: true, primer : (d) => d.getTime() },
'Project_Name' // scalar string value
));
console.log(sortedFeatures);
.as-console-wrapper {
top: 0;
max-height: 100% !important;
}