Я хотел бы использовать комбинацию Arrayr.prototype.reduce
и Arrayr.prototype.some
методов с оператором распространения.
1. Явное решение. На основе полного знания объекта массива.
list = list.reduce((r, i) =>
!r.some(j => i.x === j.x && i.y === j.y) ? [...r, i] : r
, [])
Здесь мы имеем строгое ограничение по сравнению структуры объектов: {x: N, y: M}
.
2. Общий раствор, JSON.stringify()
. У сравниваемых объектов может быть любое количество любых свойств.
list = list.reduce((r, i) =>
!r.some(j => JSON.stringify(i) === JSON.stringify(j)) ? [...r, i] : r
, [])
Этот подход имеет ограничение на заказ свойства, поэтому [{x:1, y:2}, {y:2, x:1}]
не будут фильтроваться.
3. Общий раствор, Object.keys()
. Приказ не имеет значения.
list = list.reduce((r, i) =>
!r.some(j => !Object.keys(i).some(k => i[k] !== j[k])) ? [...r, i] : r
, [])
Этот подход имеет другое ограничение: объекты сравнения должны иметь одинаковый список ключей. Таким образом, [{x:1, y:2}, {x:1}]
будет отфильтрован, несмотря на очевидную разницу.
4. Родовой раствор, Object.keys()
+ .length
.
list = list.reduce((r, i) =>
!r.some(j => Object.keys(i).length === Object.keys(j).length
&& !Object.keys(i).some(k => i[k] !== j[k])) ? [...r, i] : r
, [])
С последними объектами подхода сравниваются количество ключей, самих ключей и значений ключей.
Я создал Plunker, чтобы поиграть с ним.
Возможный дубликат [Удалить дубликаты из массива JavaScript] (http://stackoverflow.com/questions/9229645/remove-duplicates-from-javascript-array) – Rajesh
Примечание что это не двумерный массив, а массив массивов. – Aaron