在TypeScript中按布尔属性对数组进行排序

4

我正在使用 angular 10,想知道如何对这个数组进行排序。

var dic = [
  { state: false, id: 1 },
  { state: true, id: 2} ,
  { state: false, id: 3 },
  { state: true, id: 4 },
  { state: false, id: 5 }
]

我想按布尔值 state 的值进行排序,以便结果按如下方式显示:
[
  { state: true, id: 2 },
  { state: true, id: 4 },
  { state: false, id: 1 },
  { state: false, id: 3 },
  { state: false, id: 5 }
]
< p > 数组中首先放置 true 值。

我需要使用 TypeScript 中的哪个属性或方法来实现这个效果?

谢谢!


1
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort - tkausl
3个回答

4
您可以使用 Array#sort 方法,将 state 的布尔值进行转换,以实现此操作。
Number(true) //1
Number(false) //0

const dic = [
  { state: false, id: 1 },
  { state: true, id: 2 },
  { state: false, id: 3 },
  { state: true, id: 4 },
  { state: false, id: 5 }
];

dic.sort(({ state: stateA = false }, { state: stateB = false }) =>
  Number(stateB) - Number(stateA)
);

console.log(dic);


是的,它有效!你能否更详细地解释一下它是如何工作的? - Luis Bermúdez
你不需要使用 Number 来转换布尔值。只需简化 dic.sort((a, b) => b.state - a.state); - Nguyễn Văn Phong
1
关于数字,我猜Typescript想要显式转换。 - dhilt

1
你可以通过像这样简化来完成它。
dic.sort((a, b) => b.state - a.state);

解释:

我们都知道:

false // 0
true // 1

所以
false - true // -1
true - false // 1
true - true // 0
false - false // 0

演示

const dic = [
  { state: false, id: 1 },
  { state: true, id: 2 },
  { state: false, id: 3 },
  { state: true, id: 4 },
  { state: false, id: 5 }
];

dic.sort((a, b) => b.state - a.state);

console.log(dic);


0

您可以通过将布尔值转换为整数值10来按状态排序,方法是附加双感叹号(!!)或双波浪线(~~)。如果结果为0,则移动到id值。

const dic = [
  { state: false  , id: 1 },
  { state: true   , id: 2 },
  { state: false  , id: 3 },
  { state: true   , id: 4 },
  { state: false  , id: 5 }
];

dic.sort(({ state: stateA, id: idA }, { state: stateB, id: idB }) =>
  (!!stateB - !!stateA) || (idA - idB));

console.log(dic);
.as-console-wrapper { top: 0; max-height: 100% !important; }

或者:

(~~stateB - ~~stateA) || (idA - idB)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接