Как удалить повторяющиеся массивы внутри массива в Javascript?

Как удалить повторяющиеся отсортированные массивы в Javascript? Я попытался создать новый массив, используя синтаксис распространения в новом наборе, но это выглядит чрезвычайно сложно и заставило мой результирующий набор выглядеть так:

[ [ '-', '1', ',', '0', ',', '1' ],
  [ '-', '1', ',', '-', '1', ',', '2' ] ]
[ [ '-', '1', ',', '0', ',', '1' ],
  [ '-', '1', ',', '-', '1', ',', '2' ] ]
[ [ '0', ',', '0', ',', '0' ] ]
[ [ '0', ',', '0', ',', '0' ] ]
[ [ '-', '4', ',', '-', '2', ',', '6' ],
  [ '-', '4', ',', '0', ',', '4' ],
  [ '-', '4', ',', '1', ',', '3' ],
  [ '-', '4', ',', '2', ',', '2' ],
  [ '-', '2', ',', '-', '2', ',', '4' ],
  [ '-', '2', ',', '0', ',', '2' ] ]
[ [ '-', '4', ',', '-', '2', ',', '6' ],
  [ '-', '4', ',', '0', ',', '4' ],
  [ '-', '4', ',', '1', ',', '3' ],
  [ '-', '4', ',', '2', ',', '2' ],
  [ '-', '2', ',', '-', '2', ',', '4' ],
  [ '-', '2', ',', '0', ',', '2' ] ]

или

[ [ '-1,0,1' ], [ '-1,-1,2' ] ]
[ [ '-1,0,1' ], [ '-1,-1,2' ] ]
[ [ '0,0,0' ] ]
[ [ '0,0,0' ] ]
[ [ '-4,-2,6' ],
  [ '-4,0,4' ],
  [ '-4,1,3' ],
  [ '-4,2,2' ],
  [ '-2,-2,4' ],
  [ '-2,0,2' ] ]
[ [ '-4,-2,6' ],
  [ '-4,0,4' ],
  [ '-4,1,3' ],
  [ '-4,2,2' ],
  [ '-2,-2,4' ],
  [ '-2,0,2' ] ]

заметьте, это после того, как я установил их в строки. Набор не удалит повторяющиеся отсортированные массивы, поскольку они являются разными объектами.

Вот код.

var threeSum = function (arr) {
    let map = new Map();
    for (let i = 0; i < arr.length; i++) {
        let num = arr[i];
        if (map.has(num)) {
            map.get(num).push(i);
        }
        else {
            map.set(num, [i]);
        }
    }

    const results = [];
    for (let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            let diff = (arr[i] + arr[j]);
            diff = (diff == 0) ? diff: diff * -1;
            if (map.has(diff)) {
                let mArr = map.get(diff);
                for (let k = 0; k < mArr.length; k++) {
                    if (mArr[k] != i && mArr[k] != j ) {
                        results.push([arr[i], arr[j], diff]);
                    }
                }
            }
        }
    }

    results.forEach((value) => {
        value.sort((a, b) => { return a - b });
    });
    let newResults = results.filter((val, idx, arr) => {
        /// how do i do this
    })

    console.info(newResults);
    return newResults;

}

console.info(threeSum([-1, 0, 1, 2, -1, -4]));
console.info(threeSum([0,0,0,0]));
console.info(threeSum([-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]));

Пока они отсортированы, вы можете преобразовать массив в строку с помощью JSON.stringify или join() и перейти к Set или Map в качестве строковых ключей.

charlietfl 08.04.2019 00:59

Каков формат ожидаемого вывода?

charlietfl 08.04.2019 01:01

Ожидается: [[-4,-2,6],[-4,0,4],[-4,1,3],[-4,2,2],[-2,-2,4], [-2,0,2]]

Tae Soo Kim 08.04.2019 01:02

И какой вход для этого?

charlietfl 08.04.2019 01:03

Ввод: [-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]

Tae Soo Kim 08.04.2019 01:03

хорошо ... не ясно, какие правила разбиения на фрагменты должны получить ожидаемые результаты от этого ввода

charlietfl 08.04.2019 01:05

LMAO Имея массив nums из n целых чисел, существуют ли элементы a, b, c в nums такие, что a + b + c = 0? Найдите все уникальные триплеты в массиве, сумма которых равна нулю. Примечание. В наборе решений не должно быть повторяющихся троек.

Tae Soo Kim 08.04.2019 01:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
7
314
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

задавать идеально подходит для этой задачи. Наборы поддерживают условие уникальности всех своих элементов. Вот как вы можете выполнить свою задачу:

  1. Создайте новый набор, содержащий элементы результатов: let set = new Set(results.map(result => JSON.stringify(result))
  2. Преобразуйте набор в массив. Это можно сделать с помощью Array.from(set).map(elem => JSON.parse(elem))

Необходимо преобразовать массивы в строки, чтобы они были уникальными в наборе. [1,2] != [1,2]... попробуй console.info(new Set([[1,2], [1,2]])) // size=2

charlietfl 08.04.2019 01:11

Да, это дало мне точно такой же массив

Tae Soo Kim 08.04.2019 01:12

Извините, я совсем забыл об этом. Как вы можете исправить мою ошибку, .map преобразуя результаты в строки перед их вставкой в ​​набор, а затем .map возвращая их обратно в массивы, когда вы извлекаете их из набора. Я отредактировал свой ответ, чтобы отразить это.

chiragzq 08.04.2019 01:16

И также должны быть отсортированы перед их строкой

charlietfl 08.04.2019 01:17
.sort можно вызывать после преобразования набора в ошибку и перед отображением строки обратно в массив.
chiragzq 08.04.2019 01:19

Ааа, но если бы результаты были [[1,2],[2,1]], а OP нужны уникальные отсортированные массивы ... они будут преобразованы в 2 заданных значения без сортировки

charlietfl 08.04.2019 01:21

Черт возьми, я знал, что что-то упускаю. При сопоставлении вывода вы можете отсортировать перед строкой JSON.stringify(result.sort()), а затем также отсортировать сопоставленный вывод.

chiragzq 08.04.2019 01:26

Могут быть и другие проблемы при формировании results, но просто получить уникальные элементы из отсортированного массива:

Определите функцию для проверки равенства массивов a и b для первых L индексов (поскольку a == b сам по себе не работает):

let equal = function(a, b, L){
    for (let i=0; i<L; ++i) {
        if (a[i] != b[i]) return false; 
    }
    return true;
}

Нажмите на newResults при обнаружении нового элемента.

var threeSum(...
...
    if (results.length == 0){
        return [];
    }
    newResults = [results[0]];

    for (let i = 1; i < results.length; ++i){
        if (!equal(results[i], newResults[newResults.length - 1], 3)){
            newResults.push(results[i]);
        }
    }

    return newResults;
}

Но могут быть некоторые другие проблемы, такие как перебор всех элементов map.get(diff), хотя первый элемент mArr[0] является ключом (а остальные значения)

Другие вопросы по теме