JavaScript - найти уникальные объекты в массиве на основе нескольких свойств

Мне нужно найти уникальные объекты из массива на основе 2 свойств, как показано ниже. Когда «класс» и «тариф» совпадают, мне нужно извлечь уникальные значения и получить их в массиве результатов.

Источник:

var arr = [{class:"second", fare: "a"}, 
 {class:"second", fare: "b"},
 {class:"first", fare: "a"},
 {class:"first", fare: "a"},
 {class:"second", fare: "a"},
 {class:"first", fare: "c"}
]

Ожидаемый результат:

var result = [{class:"second", fare: "a"},
 {class:"second", fare: "b"},
 {class:"first", fare: "a"},
 {class:"first", fare: "c"}
]

Я посмотрел в SO и смог найти ответ, который фильтруется на основе одного свойства (Создать массив уникальных объектов по свойству), но не могу найти, что можно сделать на основе 2 свойств.

 user66303127 июл. 2016 г., 15:07
@ alex030293 Нет проблем с использованиемclass как имя свойства.
 whyAto827 июл. 2016 г., 15:07
@ alex030293 - да, я согласен. я просто использовал его для демонстрации, на самом деле я не использую класс
 whyAto827 июл. 2016 г., 15:07
@ Katana314 - Я попробовал пару вещей, но потом удалил этот код. Во всяком случае, постараюсь поставить это.
 alejandromav27 июл. 2016 г., 15:02
class является зарезервированным словом ES6. Используйте «вид», «тип» или любую другую альтернативу.
 Katana31427 июл. 2016 г., 15:01
Я думаю, что было бы больше готовности помочь, если бы вы показали свою собственную попытку решения. Ты неиметь получать ответы из интернета; даже долгое решение, основанное на слабом знании доступа к ключу объекта, может заставить вас задуматься о важных деталях.

Ответы на вопрос(3)

Использование комбинированного ключа и карты

const array = [
 { class: "second", fare: "a" }, 
 { class: "second", fare: "b" }, 
 { class: "first", fare: "a" }, 
 { class: "first", fare: "a" }, 
 { class: "second", fare: "a" }, 
 { class: "first", fare: "c" }
];

console.log(unique(array, ['class', 'fare']));

function unique(arr, keyProps) {
 const kvArray = arr.map(entry => {
  const key = keyProps.map(k => entry[k]).join('|');
  return [key, entry];
 });
 const map = new Map(kvArray);
 return Array.from(map.values());
}

Ты можешь использоватьforEach зациклить иfilter или жеfind свойство массива, чтобы найти, существует ли элемент в массиве

var arr = [{
      class: "second",
      fare: "a"
    }, {
      class: "second",
      fare: "b"
    }, {
      class: "first",
      fare: "a"
    }, {
      class: "first",
      fare: "a"
    }, {
      class: "second",
      fare: "a"
    }, {
      class: "first",
      fare: "c"
    }]
    var _unArray = []; // new array without duplicate
    arr.forEach(function(item) { // loop through array which contain duplicate
      // if item is not found in _unArray it will return empty array
       var isPresent = _unArray.filter(function(elem) {
        return elem.class === item.class && elem.fare === item.fare
      })
      if (isPresent.length == 0) { 
        _unArray.push(item)
      }
    })
    console.log(_unArray)

JSFIDDLE

 user66303127 июл. 2016 г., 18:16
Неудовлетворительно, чтобы решение имело свойстваclass а такжеfare запеченный в нем.
Решение Вопроса

Вы можете создать комбинированный ключ для хеш-таблицы и фильтровать данный массив.

var arr = [{ class: "second", fare: "a" }, { class: "second", fare: "b" }, { class: "first", fare: "a" }, { class: "first", fare: "a" }, { class: "second", fare: "a" }, { class: "first", fare: "c" }],
    result = arr.filter(function (a) {
        var key = a.class + '|' + a.fare;
        if (!this[key]) {
            this[key] = true;
            return true;
        }
    }, Object.create(null));

console.log(result);

 Nina Scholz27 июл. 2016 г., 15:16
который генерирует действительно пустой объект без прототипов, какtoString или так.
 whyAto827 июл. 2016 г., 15:14
Эй, только одно сомнение, зачем нам здесь нужен "Object.create (null)"?
 Nina Scholz27 июл. 2016 г., 15:18
на самом деле нет, но я не знаю ваших данных.
 whyAto827 июл. 2016 г., 15:17
так будет ли это необходимо здесь

Ваш ответ на вопрос