I’m trying to sort the map based on its value properties, such that all refCount
of 0
appear first in loadstamp
order; and, then, the other non-zero refCount entries appear in loadstamp order irregardless of the refCount.
The two versions shown provide the desired result (at least for this example map) and my question is, Is it possible to make the if conditions in the sort function simpler, especially the refcount
tests of either both rows being zero or both non-zero?
Thank you.
let m = new Map( [
['01001', Object.create(null, {refCount: {value: 0}, loadstamp: { value: 19}})],
['01002', Object.create(null, {refCount: {value: 1}, loadstamp: { value: 18}})],
['01003', Object.create(null, {refCount: {value: 0}, loadstamp: { value: 17}})],
['01004', Object.create(null, {refCount: {value: 3}, loadstamp: { value: 16}})],
['01005', Object.create(null, {refCount: {value: 0}, loadstamp: { value: 15}})],
['01006', Object.create(null, {refCount: {value: 5}, loadstamp: { value: 14}})],
['01007', Object.create(null, {refCount: {value: 0}, loadstamp: { value: 13}})],
['01008', Object.create(null, {refCount: {value: 2}, loadstamp: { value: 12}})],
['01009', Object.create(null, {refCount: {value: 0}, loadstamp: { value: 11}})],
['01010', Object.create(null, {refCount: {value: 4}, loadstamp: { value: 5}})]
]
);
let iters = 0;
sorted = new Map( [...m].sort( (a,b) => {
iters += 1;
if (
( b[1].refCount === 0
&& a[1].refCount > 0
)
||
( b[1].refCount > 0
&& a[1].refCount === 0
)
) {
return a[1].refCount - b[1].refCount;
} else {
return a[1].loadstamp - b[1].loadstamp;
}
}));
console.log(`total iters: ${iters}`);
sorted.forEach( (v,k) =>
console.log(`key: ${k}; refCount: ${v.refCount}; loadStamp: ${v.loadstamp}`)
);
iters = 0;
sorted = new Map( [...m].sort( (a,b) => {
iters += 1;
if (
( b[1].refCount === 0
&& a[1].refCount === 0
)
||
( b[1].refCount > 0
&& a[1].refCount > 0
)
) {
return a[1].loadstamp - b[1].loadstamp;
} else {
return a[1].refCount - b[1].refCount;
}
}));
console.log(`total iters: ${iters}`);
sorted.forEach( (v,k) =>
console.log(`key: ${k}; refCount: ${v.refCount}; loadStamp: ${v.loadstamp}`)
);
total iters: 35
key: 01009; refCount: 0; loadStamp: 11
key: 01007; refCount: 0; loadStamp: 13
key: 01005; refCount: 0; loadStamp: 15
key: 01003; refCount: 0; loadStamp: 17
key: 01001; refCount: 0; loadStamp: 19
key: 01010; refCount: 4; loadStamp: 5
key: 01008; refCount: 2; loadStamp: 12
key: 01006; refCount: 5; loadStamp: 14
key: 01004; refCount: 3; loadStamp: 16
key: 01002; refCount: 1; loadStamp: 18
total iters: 35
key: 01009; refCount: 0; loadStamp: 11
key: 01007; refCount: 0; loadStamp: 13
key: 01005; refCount: 0; loadStamp: 15
key: 01003; refCount: 0; loadStamp: 17
key: 01001; refCount: 0; loadStamp: 19
key: 01010; refCount: 4; loadStamp: 5
key: 01008; refCount: 2; loadStamp: 12
key: 01006; refCount: 5; loadStamp: 14
key: 01004; refCount: 3; loadStamp: 16
key: 01002; refCount: 1; loadStamp: 18