Как отфильтровать дубликаты массива объектов

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
    Привет, не могли бы вы принять наиболее подходящий ответ?
Теги:

3 ответа

1
Лучший ответ

Вот еще один подход, основанный на ответе TLindig на аналогичный вопрос.

Добавьте метод фильтрации в область действия:

$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;

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

<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;
}

См. Рабочий пример

Object.values(dups); пару лет вы можете использовать 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() ];  

Ещё вопросы

Сообщество Overcoder
Наверх
Меню