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

Ionic中ng-repeat去重问题:如何去除CSV数据的重复选项

解决Ionic中ng-repeat下拉框选项重复的问题

嘿,这个问题我之前也帮不少开发者解决过——本质就是你直接遍历了原始的CSV数据,而没先处理重复值。track by $index只是帮Angular避免重复DOM元素的报错,但根本不会过滤重复的站点名称。给你两个实用的解决方案:

方法一:控制器预处理去重数据

最直接的方式是在控制器里先把重复的站点名称过滤掉,生成一个只包含唯一值的数组,再用这个数组渲染下拉框:

// 假设这是你的控制器代码
angular.module('yourApp').controller('YourController', function($scope) {
  // 假设$scope.from是你从CSV读取的原始数据
  $scope.from = [/* 你的CSV数据 */];

  // 生成去重后的站点列表
  $scope.uniqueSources = [];
  var seenSources = {}; // 用对象记录已经出现过的站点

  angular.forEach($scope.from, function(item) {
    // 可选:如果需要忽略大小写,用item.source.toLowerCase()作为key
    var sourceKey = item.source;
    if (!seenSources[sourceKey]) {
      seenSources[sourceKey] = true;
      $scope.uniqueSources.push(sourceKey);
    }
  });
});

然后修改模板,遍历去重后的数组:

<select ng-model="srcstn">
  <option ng-repeat="source in uniqueSources track by $index">{{source}}</option>
</select>

方法二:自定义Angular过滤器(更灵活)

如果你的项目里多处需要处理重复数据,自定义一个unique过滤器会更方便,复用性更强:

// 在你的app模块中定义过滤器
angular.module('yourApp').filter('unique', function() {
  return function(inputArray, propertyName) {
    var uniqueItems = {};
    var result = [];

    angular.forEach(inputArray, function(item) {
      var itemKey = item[propertyName];
      // 同样可选:忽略大小写的话用itemKey.toLowerCase()
      if (!uniqueItems[itemKey]) {
        uniqueItems[itemKey] = true;
        result.push(item);
      }
    });

    return result;
  };
});

然后在模板中直接使用这个过滤器,不需要修改控制器:

<select ng-model="srcstn">
  <option ng-repeat="x in from | unique:'source' track by x.source">{{x.source}}</option>
</select>

小提示

如果你的站点名称存在大小写差异(比如"XYZ"和"xyz"其实是同一个站点),记得在去重时统一转换为小写或大写,避免重复显示。

内容的提问来源于stack exchange,提问作者Aniket

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:36:27