我正在尝试根据地图的值属性对地图进行排序,例如:
refCount
中的所有0
按loadstamp
顺序首先出现;然后refCount
条目按 loadstamp
顺序出现,无论 refCount
如何。所示的两个版本提供了所需的结果(至少对于此示例地图而言)。是否可以使排序函数中的 if 条件更简单,尤其是两行都为零或都非零的
refcount
测试?
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
您可以减去
refCount > 0
的布尔值,当相等时减去loadstamp
:
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;
return (a[1].refCount > 0) - (b[1].refCount > 0) || 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}`)
);