首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Angular 8中的mat-table排序方式不同,大写、小写与数字和空值的排序方式不同

在Angular 8中,mat-table组件提供了排序功能,但默认情况下,它可能不会按照预期处理不同类型的数据(如大写字母、小写字母、数字和空值)。这是因为默认的排序是比较字符串Unicode码点,这会导致不同类型的数据排序结果不一致。

基础概念

  • Unicode排序:默认情况下,JavaScript的localeCompare方法按照Unicode码点进行排序,这可能导致字母大小写和数字的排序不符合直觉。
  • 自定义排序:可以通过提供自定义的比较函数来改变排序逻辑,以适应不同的数据类型和排序需求。

相关优势

  • 灵活性:自定义排序允许开发者根据具体需求调整排序逻辑。
  • 一致性:确保所有数据类型的排序结果符合预期,提高用户体验。

类型与应用场景

  • 字符串排序:适用于文本数据的排序。
  • 数字排序:适用于数值型数据的排序。
  • 混合类型排序:适用于包含多种数据类型的列。

示例代码

以下是一个Angular 8中使用mat-table并实现自定义排序的示例:

代码语言:txt
复制
import { Component } from '@angular/core';
import { MatTableDataSource } from '@angular/material/table';

export interface PeriodicElement {
  name: string;
  position: number;
  weight: number;
  symbol: string;
}

const ELEMENT_DATA: PeriodicElement[] = [
  {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'},
  {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'},
  // ... more data
];

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  displayedColumns: string[] = ['position', 'name', 'weight', 'symbol'];
  dataSource = new MatTableDataSource(ELEMENT_DATA);

  ngAfterViewInit() {
    this.dataSource.sortingDataAccessor = (item, property) => {
      switch(property) {
        case 'name': return item.name.toLowerCase();
        case 'weight': return item.weight;
        default: return item[property];
      }
    };
  }
}

在HTML模板中:

代码语言:txt
复制
<table mat-table [dataSource]="dataSource" matSort>
  <!-- Position Column -->
  <ng-container matColumnDef="position">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> No. </th>
    <td mat-cell *matCellDef="let element"> {{element.position}} </td>
  </ng-container>

  <!-- Name Column -->
  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th>
    <td mat-cell *matCellDef="let element"> {{element.name}} </td>
  </ng-container>

  <!-- Weight Column -->
  <ng-container matColumnDef="weight">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Weight </th>
    <td mat-cell *matCellDef="let element"> {{element.weight}} </td>
  </ng-container>

  <!-- Symbol Column -->
  <ng-container matColumnDef="symbol">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Symbol </th>
    <td mat-cell *matCellDef="let element"> {{element.symbol}} </td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>

解决问题的方法

通过上述代码,我们为name列提供了一个转换为小写的比较函数,而对于weight列则直接返回数值。这样可以确保无论数据是大写、小写还是数字,排序结果都是一致的。

遇到问题的原因

默认的Unicode排序可能导致不同类型的数据排序不一致,例如数字可能排在字母之前,或者大小写字母排序不符合预期。

如何解决这些问题

  • 自定义比较函数:如上所示,通过sortingDataAccessor属性提供自定义的比较逻辑。
  • 类型转换:在比较之前,将数据转换为统一的类型,例如将字符串转换为小写或数字。

通过这种方式,可以确保mat-table中的数据按照预期的方式排序,无论数据包含的是大写字母、小写字母、数字还是空值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SQL排序(一)

排序规则指定值的排序和比较方式,并且是InterSystems SQL和InterSystemsIRIS®数据平台对象的一部分。有两种基本排序规则:数字和字符串。...此转换仅用于整理目的;在InterSystems中,无论所应用的排序规则如何,SQL字符串通常以大写和小写字母显示,并且字符串的长度不包括附加的空格字符。...可以按以下方式指定排序规则:命名空间默认值表字段/属性定义索引定义查询 SELECT项查询DISTINCT和GROUP BY子句排序类型排序规则可以在字段/属性的定义或索引的定义中指定为关键字。...注意,SQLUPPER转换与SQL函数UPPER的结果不同。TRUNCATE —增强字符串数据的区分大小写,并且(与EXACT不同)允许指定截断该值的长度。...相当于大写的是两个字母“SS”。 转换为大写的SQL排序规则不会转换eszett, eszett保持为单个小写字母不变。表字段/属性定义排序在SQL中,排序规则可以分配为字段/属性定义的一部分。

1.5K20

SQL函数 %EXACT

规范数值(无论输入为数字还是字符串)在字符串值之前按数字顺序排序。 字符串值按区分大小写的字符串顺序排序。...字符串的精确排序顺序与ANSI标准的ASCII排序顺序相同:数字在大写字母字符之前排序,大写字母字符在小写字母字符之前排序。标点符号出现在序列中的多个位置。...%Exact将输入字符串作为完全数字(规范)或混合字符字符串进行排序,在混合字符串中,数字与任何其他字符的处理方式相同。...与%MVR排序规则相比,%MVR排序规则根据字符串中的数字子字符串对字符串进行排序。...DISTINCT 和 GROUP BY DISTINCT子句和GROUP BY子句根据它们的大写默认排序规则对值进行分组,并返回全部大写字母的值,即使实际数据值都不是全部大写字母也是如此。

87720
  • Angular Material 的设计之美

    丰富的颜色 Material Design 的亮点之一就是拥有非常丰富的颜色值,其实 Angular Material 的颜色变量比官方定义的色值还要多一些。...ng-matero 在使用 ng add 初始化的时候增加了预构建主题选项,生成的主题只有一份,如果有特殊需求可以自行定制。实现方式就是不同主题传入不同变量,但是这种情况下多主题控制会有问题。...我很赞同 ng-alain 对 ng-zorro-antd 表格的进一步抽象,熟悉了 ng-alain 编写表格的方式之后,我一直以为 mat-table 略显笨拙。...mat-table 对表格列宽的首选操控方式是 CSS,起初我对这种方式也存在疑虑,但是在我亲自封装了 ng-zorro-antd 的表格组件之后,我发现一切都很自然。...基于指令的布局方式和 Bootstrap 的栅格布局是两种不同的设计理念。flex-layout 的使用很简单,可以很快上手,熟悉之后你一定会喜欢这种布局方式。

    5K30

    SQL | SQL 必知必会笔记 (一 )

    SQL 不区分大小写,但一般习惯关键字用大写,列名和表名使用小写。 处理 SQL 语句时,所有空格都会被忽略。一般认为写成多行更容易维护。 选择多个列时,一定要在列名之间加上逗号,但最后一个列名不加。...检索不同的值 SELECT vend_id FROM Products; 使用 DISTINCT 关键字只返回不同的(唯一的)值。...限制结果 默认显示所有满足条件的行,可以只显示指定的行吗?**可以,但是在不同数据库实现方式不同。...第一个数字是检索的行数,第二个数字是指从哪儿开始。...NULL 表示空值,确定是否空值,不能简单的 = NULL,SELECT 语句有一个特殊的 WHERE 子句 IS NULL ,可用来检查具有 NULL 值的列。

    2.6K51

    python笔记(一)

    字符串处理 单双引号一样 .title():将每个单词的首字母变为大写,其余小写(不管原来是什么样) .upper():将字符串中所有字母变为大写 .lower():将字符串中所有字母变为小写 .strip...) 获取列表长度:len(列表) 遍历列表:for i in 列表: 最好的命名方式,列表取复数,遍历变量取单数,即: for cat in cats: 创建数字列表:...,如果VAR1位大写,VAR2为小写,则if返回值为FALSE 如果不想区分大小写,可以先使用“.lower()”都转换为小写再比,而且不会影响原来变量中的内容 比较符号: 等于:==...= 大\小(等)于:>、= 条件与:and(and两边要有空格,和变量分开)(and两边的潘丹条件可使用小括号包裹起来) 条件或:or 判断一个特定的值是否在列表中...:in 'value' in lists 不包含 not in 布尔值:True、False(大小写固定,必须首字母大写) if格式:(elif和else部分都可以省略

    1.5K30

    SQL命令 DISTINCT

    可以使用子查询实现DISTINCT、聚合函数和GROUP BY的预期组合。 字母大小写与DISTINCT优化 根据为字段定义的排序规则类型,将字符串值不同地分组在一起。...默认情况下,字符串数据类型字段使用SQLUPPER排序规则定义,该排序规则不区分大小写。 如果字段/特性排序规则类型为SQLUPPER,则分组的字段值将全部以大写字母返回。...要按原始字母大小写对值进行分组,或以原始字母大小写显示分组字段的返回值,请使用%Exact排序规则函数。...此默认设置按字母值的大写排序规则对字母值进行分组。此优化利用选定字段的索引。因此,只有在一个或多个选定字段存在索引时才有意义。它对存储在索引中的字段值进行排序;字母字符串以全部大写字母返回。...DISTINCT BY(StreamField)将流字段为空的记录数减少到一个空记录。 星号语法:DISTINCT*语法是合法的,但没有意义,因为根据定义,所有行都包含一些不同的唯一标识符。

    4.4K10

    Python 3 学习笔记:序列

    我们常用的字符,如数字、字母等,在 ASCII 码表中的码值大小依次是 数字大写字母小写字母。当然,ASCII 码表中不只包含数字、字母,其中还有许多标点符号、特殊符号(具体码表请自行查找)。..., startIndex, endIndex) 复制 字母大小写转换 lower() 该方法用于将字符串中的大写字母转换为小写字母。...1 string.lower() 复制 upper() 该方法用于将字符串中的小写字母转换为大写字母。...(list) 复制 对全部元素均为数字的列表排序很简单,如果是对字符串元素进行排序,则先对大写字母排序,然后再对小写字母进行排序。...如果想不区分大小写排序,需要指定 key 参数的值,如 key=str.lower 。 而且,需要注意如果一个列表中的元素既有数字,又有字符串,则无法使用 sort() 方法进行排序。

    2.2K10

    SQL排序(二)

    字母大小写:默认情况下,查询显示带有大写和小写字母的字符串。例外情况是对排序规则类型SQLUPPER的字段进行DISTINCT或GROUP BY操作。这些操作以所有大写字母显示该字段。...可以使用EXACT排序规则返回大小写混合的值。 DISTINCT消除仅字母大小写不同的重复项。要保留大小写不同的重复项,但要消除确切的重复项,请使用EXACT排序规则。...以下示例消除了精确的重复项(但不消除字母大写的变体),并以混合的大写和小写形式返回所有值:SELECT DISTINCT %EXACT(Name) FROM Sample.PersonUNION涉及隐式...它们已被弃用,不建议与新代码一起使用,因为它们的目的是为遗留系统提供持续的支持。他们是:%ALPHAUP — 除去问号(“?”)和逗号(“,”)之外的所有标点符号,并将所有小写字母转换为大写字母。...如果指定给%STARTSWITH的子字符串是规范数字(尤其是负数和/或小数),则%STARTSWITH可能会根据字段是否被索引而给出不同的结果。

    1.6K30

    python字符串方法详解

    =不等于、==等于、=大于等于 字符串比较ASCII编码(小写字母编码大于大写字母,小鬼不能当家,往后排)  排序操作  sorted(s,key=None,reverse=False)...返回排序列表,reverse默认是升序,当为True时为倒序  内置函数all()&any()  all(s):如果s的所有值都为True,返回True;否则返回False any(s):如果s的任意值为...;eg:first,*s,last = [1,2,3,4,5]去掉最大值和最小值  字符串  字符串或串(String)是由数字、字母、下划线组成的一串字符,是编程语言中表示文本的数据类型,是不可变的数据类型...b,c,d,o,x,X浮点数e,E,%   b:输出整数的二进制方式c:输出整数对应的Unicode字符d:输出整数的十进制方式o:输出整数的八进制方式x:输出整数的小写十六进制方式...X:输出整数的大写十六进制方式e:输出浮点数对应的小写字母e的指数形式E:输出浮点数对应的大写字母E的指数形式f:输出浮点数的标准浮点形式s:输出格式化字符串p:用十六进制数格式化变量的地址%:输出浮点数的百分形式

    1.2K00

    Python 方法

    index() 在列表中查找值的下标,如果不存在,返回ValueError 如果有重复的值,就返回第一次出现的下标 spam = ['a','b','c'] spam.index('a') 返回...对列表中的数值进行排序,排序是逆序 对列表中的字符串按照ascii码排序 sort(str.lower)表示安装普通字典排序 3个字典方法 keys()、values()、items() spam...upper() lower() upper()是将原来的字符串转换为大写 lower()是将原来的字符串转换为小写 ? ?... isupper() 表示字符串都是大写 islower() 表示字符串都是小写 isalpha() 表示字符串只包含字母,并且不为空 isalnum() 表示字符串只包含字母和数字,并且不为空...isdecimal() 表示字符串只包含数字字符,并且不为空 isspace() 表示字符串只包含空格、制表符和换行,并且不为空 istitle() 以大写字母开头,后面都是小写字母的单词

    43320

    workerman 签名验证中间件 timestamp+nonce+sign 时间戳 + 随机数 + 签名参数接口验证

    接口在网络传输过程中,参数值可以被修改,但是因为不了解sign计算方式,一般没法修改sign的值。...当服务器调用接口前会按照sign的规则重新计算出sign的值然后和接口传递的sign参数的值做比较,如果相等表示参数值没有被篡改,如果不等,表示参数被非法篡改了。...特别注意以下重要规则: ◆ 参数名ASCII码从小到大排序(字典序); ◆ 如果参数的值为空不参与签名; ◆ 参数名区分大小写; (((注意:不同环境后端框架md5结果不一样为,32/16位大小写,此处得前后端对应...进行md5加密候转化成大写,再拼接密钥,再md5加密,并且转化为大写 * 签名生成的通用步骤如下: * * 第一步,设所有发送的数据非空参数值的参数按照参数名ASCII码从小到大排序...* * 特别注意以下重要规则: * * ◆ 参数名ASCII码从小到大排序(字典序); * ◆ 如果参数的值为空不参与签名; * ◆ 参数名区分大小写;

    2.2K31

    前端面试手册

    input link meta 导入样式link和@import的区别 作用范围、加载时机、兼容性三方面不同 CSS和JS的放置位置 CSS放在head防止页面回流和重绘,JS放body末尾防止页面阻塞...toUpperCase 转大写 数组的常用方法 concat 连接 join 拼接 pop 删除尾 push 添加尾 shift 删除头 unshift 添加头 reverse倒叙 sort 排序...slice 截取 splice 替换 数组去重 基础循环法、排序相邻法、对象属性法、下标查询法(indexOf) 排序算法 冒泡:相邻比较后,逐个冒泡 选择:查找最小值后,逐个交换 插入:...当作为方法调用,那么this就是指这个对象 apply和call 在特定的作用域中调用,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域 接收参数的方式不同 JS框架和原理 React...单向数据,Vue结合angular和react的优点,组件化、指令、双向绑定 vue采用数据劫持结合发布订阅模式,通过Object.defineProperty()劫持各个属性的setter 、getter

    1.3K20

    JavaScript基础

    从此,Web 浏览器就开始努力(虽然有着不同的程度的成功和失败)将 ECMAScript 作为 JavaScript 实现的基础。...要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。 如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。...比较函数应该具有两个参数 a 和 b,其返回值如下: 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。 若 a 等于 b,则返回 0。...stringObj.sort(sortNumber) 复制代码 null和undefined null表示值是空,一般在需要指定或清空一个变量时才会使用,如 name=null; undefined...还有就是函数无明确的返回值时,返回的也是undefined。 null表示变量的值是空,undefined则表示只声明了变量,但还没有赋值。

    85690

    【17】进大厂必须掌握的面试题-50个Angular面试

    Angular中的提供程序是什么? 提供程序是Angular中的可配置服务。这是对依赖关系注入系统的一条指令,它提供有关获取依赖关系值的方式的信息。...Angular中的摘要周期是监视监视列表的过程,以跟踪监视变量的值的变化。在每个摘要循环中,Angular都会比较范围模型值的先前版本和新版本。...limit:将数组/字符串限制为指定数量的元素/字符。 小写: 将字符串格式化为小写。 number: 将数字格式化为字符串。 orderBy: 按表达式对数组排序。...与单向数据绑定不同,这是一个同步过程。 ## 30.组件和指令的生命周期挂钩是什么? Angular组件具有离散的生命周期,其中包含从出生到死亡过渡的不同阶段。...小写:将字符串转换为小写字符串。 有角的。大写: 将字符串转换为大写字符串。 有角的。isString: 如果当前引用是字符串,则返回true。 有角的。

    41.5K51

    模块_Haskell笔记2

    或者不暴露值构造器,仅允许通过工厂方法等方式获取该类型值(常见的比如Map.fromList): module MyModule (Tree, factory) 缺点是,这样做就无法使用值构造器进行模式匹配了...a] -> ([a], [a]) -- 递归init,直到List为空 inits :: [a] -> [[a]] -- 递归tail,直到List为空 tails :: [a] -> [[a]] 排序...compare等价(默认的比较方式就是compare),要按List长度排序的话,这样做: sortBy (compare `on` length) xs 语义同样非常清楚。...-> Bool -- 八进制数 isOctDigit :: Char -> Bool -- 十六进制数 isHexDigit :: Char -> Bool -- 字母,功能等价于isAlpha,实现方式不同...,Data.Map提供了一些字典处理函数 P.S.Data.Map中的一些函数与Prelude和Data.List模块存在命名冲突,所以使用qualified import as保留命名空间并起个别名:

    1.7K30
    领券