Функции принимают неизвестное количество массивов в качестве аргументов. Эти массивы также могут состоять из вложенных массивов. Мне нужно выбросить дубликаты и вернуть один новый массив (без дубликатов). Элементы массива должны отображаться не отсортированным образом, а в том порядке, в котором они стояли в исходном массиве.
Я использовал map, чтобы поместить каждый массив в один новый массив.
Я использовал reduce для объединения массивов.
Я использовал Set, чтобы создавать дубликаты.
Сработало только в этом случае
uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]);
Я не знаю, почему это не работает в этих случаях:
Argument Fail1 // uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);
Argument Fail2 // uniteUnique([1, 3, 2], [1, [5]], [2, [4]]);
Argument Fail3 // uniteUnique([1, 2, 3], [5, 2, 1]);
это мой код
function uniteUnique(arr) {
let test = [];
arr.map(function(argu) {
test.push(argu);
}, []);
let flat = test.reduce(function(a, b) {
return a.concat(b);
});
let unique = new Set(flat);
console.info(unique);
}
Что не так? Было бы очень любезно, если бы кто-нибудь мог сказать мне, почему мой код не работает с аргументом Fail 1-3.
В этих случаях возникает ошибка:
return a.concat(b); /n TypeError: a.concat is not a function
Ожидаемый результат:uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]) должен вернуться [1, 3, 2, 5, 4].
uniteUnique([1, 3, 2], [1, [5]], [2, [4]]) должен вернуться [1, 3, 2, [5], [4]].
uniteUnique([1, 2, 3], [5, 2, 1]) должен вернуться [1, 2, 3, 5].
uniteUnique([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8]) должен вернуться [1, 2, 3, 5, 4, 6, 7, 8].
Каков ожидаемый результат?
Вы передаете несколько аргументов, но функция имеет только один аргумент для получения



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете взять чек за элемент, если это массив, и сгладить этот массив.
const
flat = array => array.reduce((r, a) => r.concat(Array.isArray(a) ? flat(a) : a), []),
uniteUnique = (...array) => [...new Set(flat(array))];
console.info(uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]));
console.info(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
console.info(uniteUnique([1, 3, 2], [1, [5]], [2, [4]]));
console.info(uniteUnique([1, 2, 3], [5, 2, 1]));.as-console-wrapper { max-height: 100% !important; top: 0; }Это потому, что сигнатура вашей функции принимает только один параметр, arr. И здесь вы проходите только один:
uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]);
Вот почему это работает. Где В случаях сбоя вы передаете несколько массивов:
uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);
Поэтому он берет только [1, 3, 2], игнорируя остальные, и пытается уменьшить первый, начиная с первого элемента 1, который явно не является массивом, и в нем нет concat.
Что вы хотите сделать, так это изменить сигнатуру метода и удалить бесполезный map:
function uniteUnique(...test) {
let flat = test.reduce(function(a, b) {
return a.concat(b);
});
let unique = new Set(flat);
console.info(unique);
}
Используя синтаксис распространения, вы вводите test все аргументы в виде массива.
Кстати, вы также можете использовать Массив.flat, если он реализован (или полифил, если нет):
const flatUnique = (...test) => new Set(test.flat())
И, если вы хотите иметь массив вместо Set, вы можете снова получить его, используя синтаксис расширения:
const flatUnique = (...test) => [...new Set(test.flat())]
Вы можете использовать плоский и Набор
const uniteUnique = (array) => [...new Set(array.flat(Infinity))];
console.info(uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]));
console.info(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
console.info(uniteUnique([1, 3, 2], [1, [5]], [2, [4]]));
console.info(uniteUnique([1, 2, 3], [5, 2, 1]));.as-console-wrapper { max-height: 100% !important; top: 0; }
Добавьте начальное значение
[]к.reduce. Это не удается, потому что это делает1.concatв первом тестовом примере