0

我正在尝试生成术语列表及其定义,但在每个字母部分的开头放置一个标题。IE

一个

苹果

香蕉

为此,我有以下代码:

<div ng-repeat="definition in definitions">
   <div ng-if="firstLetterOfTerm(definitions[$index])!=firstLetterOfTerm(definitions[$index-1])">
      <h1>{{firstLetterOfTerm(definitions[$index])}}<hr></h1>
   </div>
   <div>{{definition.term}}</div>
</div>

definitions如果订购,这很好用。但如果不是,这不起作用。IE 考虑列表

["Banana", "Apple"]

根据我目前的逻辑,这将产生以下列表:

一个

香蕉

苹果

那是因为当我这样做时firstLetterOfTerm(definitions[$index])$index指向原始的无序列表。有什么办法可以让它正确定位$index吗?或者也许是一种不同的方式来构建这个产生相同结果的解决方案

注意:我不想预先对列表进行预排序,因为它可能非常大。

4

1 回答 1

0

您是否希望您的数组中每个字母只包含一个实例?如果定义包含 [apple,banana,avocado],它不会打印数组中每个字符串的第一个字母:a apple bbanana a avocado。

也不会第一个 firstLetterOfTerm(definitions[$index-1]) 返回 undefined 因为索引 0 - 1 不存在? 代码笔 `

<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
<script type="text/javascript">
angular.module('myStatefulFilterApp', [])
 .controller('personController', ['$scope', function($scope) {

    $scope.definitions = ['apple0', 'banana0','apple1', 'banana1','apple2', 'banana2','apple3', 'banana3']

}])
.filter('startsWith', [function(){
  var start = function(array, letter){
    console.log(arguments)
    var newArray = new Array();
    angular.forEach(array, function(x){
      if (letter == x.charAt(0)) newArray.push(x)
    })
                    return newArray;
  }
  return start;
}])


 .filter('titleCaseFilter', [ function() {  
        var titleCaseFilter = function(array) {

        var newArray = new Array();
            angular.forEach(array, function(string){
            if (newArray.indexOf(string.charAt(0)) == -1)       newArray.push(string.charAt(0));
      });
  return newArray;
}
return titleCaseFilter;
}])



</script>
<div ng-app="myStatefulFilterApp" ng-controller="personController">

<div ng-repeat="definition in definitions | titleCaseFilter">
  <div>{{definition}}</div>
  <div ng-repeat="def in definitions | startsWith:definition">
    {{def}}
  </div>
</div>
</div>

`

于 2015-03-07T01:26:49.983 回答