2016-01-09 2 views
0

У меня есть массив объектов, которые выглядят следующим образом:Как отфильтровать дубликаты из массива объектов

$scope.SACCodes = [ 
    {'code':'023', 'description':'Spread FTGs', 'group':'footings'}, 
    {'code':'024', 'description':'Mat FTGs', 'group':'footings'}, 
    {'code':'025', 'description':'CONT. FTGs', 'group':'footings'}, 
    {'code':'025', 'description':'CONT. FTGs', 'group':'levels'}, 
    {'code':'023', 'description':'Trucks', 'group':'footings'} 
] 

Мне нужно отфильтровать дубликаты, где code и group являются дубликатами. Если только один из них одинаковый, он не должен отфильтровывать его.

+0

Привет, не могли бы вы принять наиболее подходящий ответ? –

ответ

1

Вот еще один подход, основанный на TLindig's answer to a similar question.

Добавить метод фильтра в объеме:

$scope.onlyUnique = function(value, index, self) { 
    codes = self.map(function(c) {return c.code}); 
    groups = self.map(function(c) {return c.group}); 
    return codes.indexOf(value.code) === index || groups.indexOf(value.group) === index; 

Вызвать метод фильтра в вашем нг-повтором или туда, куда вы хотите уникальные значения:

<div ng-repeat="c in SACCodes.filter(onlyUnique)">code: {{c.code}} desc: {{c.description}} group: {{c.group}}</div> 

Выход:

code: 023 desc: Spread FTGs group: footings 
code: 024 desc: Mat FTGs group: footings 
code: 025 desc: CONT. FTGs group: footings 
code: 025 desc: CONT. FTGs group: levels 
1

Используется хелперный хеш, чтобы отметить, какая комбинация code и group уже обработана. Только если он находит неиспользованную до сих пор комбинацию, он добавляет ее в массив retVal;

function dedup() { 
    var dups = {}; 
    var retVal = []; 

    for (var i = 0; i < $scope.SACCodes.length; i++) { 
     var sCode = $scope.SACCodes[i]; 
     var key = sCode.code +'/'+ sCode.group; 
     if (!dups[key]) { 
      retVal.push (sCode); 
      dups[key] = sCode; 
     } 
    } 
    return retVal; 
} 

See working example

пару лет вниз по дороге, вы могли бы использовать Object.values(dups); вместо retVal и тем самым укорачивать код.

1

Путь ES6.

var m = new Map(); 

SACCodes.forEach (function(item) { 
    var key = item.code + item.group; 
    if (!m.has(key)){ 
     m.set(key, item); 
    } 
}); 
SACCodes= [ ...m.values() ]; 
Смежные вопросы