Отфильтровать массив по двум полям

Рейтинг: 0Ответов: 2Опубликовано: 19.09.2014

Что-то совсем не получается отфильтровать данный массив:

[ { num: 'iv', group: 'p', title: '1' },
  { num: 'iv', group: 'p', title: '2' },
  { num: 'v', group: 'p', title: '3' },
  { num: 'iv', group: 'n', title: '4' },
  { num: 'iv', group: 'p', title: '5' },
  { num: 'iv', group: 'm', title: '6' },
  { num: 'vi', group: 'p', title: '7' } ]

Нужно отфильтровать объекты с одинаковыми значениями в num и group, чтобы на выходе получить

[ { num: 'iv', group: 'p', title: '1' },
  { num: 'v', group: 'p', title: '3' },
  { num: 'iv', group: 'n', title: '4' },
  { num: 'iv', group: 'm', title: '6' },
  { num: 'vi', group: 'p', title: '7' } ]

Отфильтровать по одному полю получается:

var used = {};
var clean = arr.filter(function(obj, i) {
    return (obj.num in used) ? 0 : (used[obj.num] = 1);
});

А вот по двум полям сравнить ну никак не получается.

Ответы

▲ 0Принят

Не знаю, может это выглядит тупо, но так попробуйте

var clean = arr.filter(function(obj, i) {
return (obj.num+obj.group in used) ? 0 :
(used[obj.num+obj.group]= 1);
});
▲ 0
var clean = arr.filter(function(obj, i) {
    return (obj.group in used && obj.num in used) ? '' : (used[obj.group] = 1) && (used[obj.num] = 1);
});

С массивом в первом посте все норм работает, а вот если массив увеличить, к пример

var arr = [ { group: 'group-sedan', num: 'iv' },
   { group: 'group-sedan', num: 'iv' },
   { group: 'group-wagon_5', num: 'iv' },
   { group: 'group-wagon_5', num: 'iv' },
   { group: 'group-sedan', num: 'iii' },
   { group: 'group-sedan', num: 'iii' },
   { group: 'group-wagon_5', num: 'iii' },
   { group: 'group-wagon_5', num: 'iii' },
   { group: 'group-wagon_5', num: 'ii' },
   { group: 'group-wagon_5', num: 'ii' },
   { group: 'group-sedan', num: 'ii' },
   { group: 'group-sedan', num: 'ii' },
   { group: 'group-coupe', num: 'i' },
   { group: 'group-coupe', num: 'i' },
   { group: 'group-sedan', num: 'i' },
   { group: 'group-sedan', num: 'i' } ]

Получим 5 объектов, а нужно получить 8