Javascript - удаление дубликатов массивов из набора - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть массив массивов.

let myArr = [[1,2,3],[1,2,3],[3,4,5],[5,6,7],[5,6,7]];

Я хочу отфильтровать все повторяющиеся массивы в myArr, чтобы в нем хранились только уникальные:

let myArr = [[1,2,3],[3,4,5],[5,6,7]];

Я думал, что, преобразовав myArr в набор, он очиститвсе «дублирующие» значения, однако, этого не произошло:

let mySet = new Set(myArr);
// Set is: {[1,2,3],[1,2,3],[3,4,5],[5,6,7],[5,6,7]}

Как правильно отфильтровать myArr для хранения только уникальных элементов?

Ответы [ 4 ]

0 голосов
/ 22 ноября 2018

Вы также можете решить эту проблему с помощью одного Array.reduce, где вы группируете по Array.toString():

const data = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]]

const r = Object.values(data.reduce((r,c) => (r[c.toString()] = c, r), {}))

console.log(r)
0 голосов
/ 21 ноября 2018

Попробуйте это:

 function remove(myArr) {
    let s = new Set(myArr);
    let it = s.values();
    return Array.from(it);
}
0 голосов
/ 21 ноября 2018

Вы можете использовать JSON, чтобы идентифицировать дубликаты в наборе и хранить только уникальные массивы в своем списке.

const elem_sets = new Set();
const result = arr.filter(item => !elem_sets.has(JSON.stringify(item)) ? elem_sets.add(JSON.stringify(item)) : false);

console.log(result);
0 голосов
/ 21 ноября 2018

Вы можете взять строковые массивы в качестве значения для набора и отобразить затем массивы обратно.

var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
    unique = Array.from(
        new Set(array.map(a => JSON.stringify(a))),
        json => JSON.parse(json)
    );
    
console.log(unique);

Если вам нужны оригинальные массивы, вы можете отфильтровать с помощью Set.

var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
    unique = array.filter(
        (s => a => (j => !s.has(j) || s.set(j))(JSON.stringify(a)))
        (new Set)
    );
    
console.log(unique);
...