html 如果两个字符串在表Angular 13中匹配,则将字符串加1

rnmwe5a2  于 2022-11-27  发布在  Angular
关注(0)|答案(1)|浏览(275)

我有一个要求,其中表中的第一列是序列号数组。我需要比较表中的这一列,如果两行具有相同的最后一位数字/序列号:显示最后6位数字(增加位数,直到序列号唯一),并以省略号文本的形式显示。
始终用省略号显示字符串中的最后5个字母,但例如,如果第一行的序列号为SNM 1A 892 P4 JRI 3LKI 1701205001002 ANKSC,第二行的序列号为SNM 1A 892 P4 JRI 3LKI 17012050010026 ANKSC,则将字符串递增1,显示最后6个字母,如果最后6个字母再次不同,则显示最后7个字母,直到序列号唯一。可选:....2ANKSC位于表格第一行,....6ANKSC位于表格第二行。
有谁能指导如何用Angular 来写逻辑吗?
我有想法,但如何增加字符串,并显示它的形式椭圆悬停字符串这一部分,我落后。

ddrv8njm

ddrv8njm1#

据我所知,您的任务包括以下子任务:

  • 分割给定的序列号,使第二个部件是唯一的。
  • 按结尾升序对序列号进行排序。
  • 显示序列号,并在鼠标悬停时突出显示其唯一的结尾。

我认为这可以通过以下解决方案来实现:
首先是main-logic,重点关注确定在何处拆分序列号的递归方法:

serialNumbersRaw = ['SNM1A892P4JRI3LKI1701205001002ANKSC', 'SNM1A892P4JRI3LKI17012050010026ANKSC',
                        'A8909880890078', 'B8909880290078', 'A8909880490078', 'C8901880490078',
                        'C8909880895078', 'D8909880190078' ];
    
    serialNumbersDtos: SerialNumberDto[] = [];

    ngOnInit(): void {
        // Initialize serial-number dtos:
        this.serialNumbersDtos = this.serialNumbersRaw.map(n => ({ fullSN: n } as SerialNumberDto));
        const defaultNumbOfDigitsToCut = 5;
        // Determine unique-endings:        
        this.prepareSerialNumberDtosRec(this.serialNumbersDtos, defaultNumbOfDigitsToCut);
        // Sort serial-numbers ascending:
        this.serialNumbersDtos = this.serialNumbersDtos.sort((sn1, sn2) => sn1.endsWith < sn2.endsWith ? -1 : 1);
    }

    private prepareSerialNumberDtosRec(snDtos: SerialNumberDto[], numbOfDigitsToCut: number) {

        // Split serial-number into two pieces:
        this.modifyDtos(snDtos, numbOfDigitsToCut);

        // If the beginning of a serial-number is an empty string, you shouldn't cut any further:
        if (snDtos.some(sn => sn.startsWith.length === 0)) {
            return;
        }

        // Create an array of sub-arrays, where all elements of a sub-array have the same 'endsWith' value:
        const groupedSnDtos = Object.values(
            snDtos.reduce<{ [index: string]: SerialNumberDto[] }>(
                (group, sn) => ((group[sn.endsWith] || (group[sn.endsWith] = [])).push(sn), group), {}
            )
        );

        // Remove unique dtos and thereby exclude them from further processing:
        const nonUniqueSnDtos = groupedSnDtos.filter(group => group.length > 1);

        // Check if there are still objects, with non-unique endings:
        if(!nonUniqueSnDtos.length) {
            return;
        }

        // Process remaining objects with non-unique endings:
        nonUniqueSnDtos.forEach(snWithCommonEndings => {
            this.prepareSerialNumberDtosRec(snWithCommonEndings, (1 + numbOfDigitsToCut));
        });
    }

    /* Adapt the beginning and the ending of the serial-number */
    private modifyDtos(snDtos: SerialNumberDto[], numbOfDigitsToCut: number) {
        snDtos.forEach(dto => {
            if (dto.fullSN.length >= numbOfDigitsToCut) {
                dto.endsWith = dto.fullSN.substring(dto.fullSN.length - numbOfDigitsToCut);
                dto.startsWith = dto.fullSN.substring(0, dto.fullSN.length - dto.endsWith.length);
            }
        });
    }

然后是dto级

class SerialNumberDto {
    fullSN: string = '';
    startsWith: string = '';
    endsWith: string = '';
    displayChip: boolean = false;
}

html部分

<div *ngFor="let dto of serialNumbersDtos"
    (mouseover)="dto.displayChip=true"
    (mouseout)="dto.displayChip=false">

    {{ dto.startsWith }}<span [ngClass]="{ 'chip': dto.displayChip }">{{ dto.endsWith }}</span>

</div>

最后是CSS

.chip {
    border: 1px solid black;
    border-radius: 20px;
    background-color: rgba(0, 0, 255, 0.1);
    cursor: default;
}

相关问题