按值属性对地图进行排序:可以缩短这些测试吗?

问题描述 投票:0回答:1

我正在尝试根据地图的值属性对地图进行排序,例如:

  • 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
javascript sorting
1个回答
0
投票

您可以减去

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}`)
);

© www.soinside.com 2019 - 2024. All rights reserved.