You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular自定义SortPipe传递courseAssignment.category排序参数无效求助

问题根因

  • 当前的SortPipe仅支持读取对象的一级属性,传入带.的嵌套字段路径时,a[sortField]会直接把整个路径字符串当作键名去查找,无法递归获取嵌套属性,自然返回undefined,排序也就不生效
  • 点击事件里设置的排序字段路径写错了,多了前缀courses.,正确路径应该是courseAssignment.category

修复方案

1. 改造SortPipe,支持嵌套属性读取

新增嵌套属性取值逻辑,同时如果需要排序参数修改后即时生效,可将管道设置为非纯模式,修改后代码如下:

import { Pipe, PipeTransform } from '@angular/core';
import { courses } from '../interface/courses';

@Pipe({
  name: 'sort',
  // 非纯管道配置,保证参数变更时自动重新执行排序;如果不想用非纯管道,也可以每次修改排序参数后浅拷贝一次courseList数组触发变更检测
  pure: false
})
export class SortPipe implements PipeTransform {
  transform(value: Array<courses>, args: any[]): Array<courses> {
    // 边界判断,避免空值报错
    if (!value || !args || args.length < 2) return value;
    const sortField = args[0];
    const sortDirection = args[1];
    let multiplier = 1;

    if (sortDirection === 'desc') {
      multiplier = -1;
    }

    // 新增嵌套属性读取方法
    const getNestedValue = (obj: any, path: string) => {
      return path.split('.').reduce((current, key) => current?.[key], obj);
    };
        
    value.sort((a: courses, b: courses) => {
      const valA = getNestedValue(a, sortField);
      const valB = getNestedValue(b, sortField);
      if (valA < valB) {
        return -1 * multiplier;
      } else if (valA > valB) {
        return 1 * multiplier;
      } else {
        return 0;
      }       
    });

    return value;
  }  
}

2. 修正点击事件的排序字段路径

去掉多余的courses.前缀,修改后代码如下:

onSortbyParam() {
    this.SortbyParam = 'courseAssignment.category';
    this.SortDirection = 'asc';
}

onSortbyParam1() {
    this.SortbyParam = 'courseAssignment.category';
    this.SortDirection = 'desc';
}

内容的提问来源于stack exchange,提问作者M D V Ajay kumar 360

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:54:00