2016-09-06 3 views
0

Итак, у меня есть функция uniteUnique. Он должен получить аргументы и консонировать их в один массив. Если бы определенное количество аргументов, например 3, я бы реализовать как функцию нижеКак я могу конкатрировать массивы с неизвестным количеством аргументов

function uniteUnique(arr) { 
    var args = []; 
    var newArgs; 
for (var i = 0; i < arguments.length; i++) { 
    args.push(arguments[i]); 
    newArgs = args[0].concat(args[1], args[2]); 
    } 
    return newArgs ; 
} 

uniteUnique([1, 3, 2], [1, [5]], [2, [4]]); 

Но что, если функция uniteUnique будет иметь 2 аргумента или любое другое число.

uniteUnique([1, 2, 3], [5, 2, 1]) 

Как сделать мою функцию знать, сколько аргументов он должен concatonate, и как бы он быть реализован внутри функции CONCAT()?

EDIT:

Вывод должен выглядеть следующим образом:

uniteUnique([1, 3, 2], [1, [5]], [2, [4]]) должен вернуть [1,3,1,1,[5],2, [4]] and uniteUnique([1, 2, 3], [5, 2, 1]) должен возвращать [1,2,3,5,2,1]

+1

Вы можете указать примеры входов и их соответствующие выходы на вызове 'uniteUnique '? – gurvinder372

+0

Как вы используете аргумент 'arr'? И почему вы возвращаете 'arguments', а не' newArgs'? – MarcoS

+0

@MarcoS Я отредактирую его, но newArgs вернет только последний аргумент. – Giedrius

ответ

2

Я не уверен, полностью ли я понимаю ваш вопрос, но: а как насчет этого простого решения?

function uniteUnique() { 
    return Array.prototype.slice.call(arguments); 
} 

arguments объект на самом деле не Array экземпляр, и не имеет какого-либо из методов массива. Таким образом, arguments.slice (...) не будет работать, потому что объект arguments не имеет метода среза.

Вместо этого у Arrays есть этот метод, и потому что объект arguments очень похож (...) на массив, эти два являются совместимыми. Это означает, что мы можем использовать методы массива с объектом arguments. И методы массива возвращают массивы, а не другие объекты аргументов.

Для более throughtful объяснения смотрите this SO answer ...

UPDATE (ответить OP комментарий):

Если вам нужно глубокого слияния, вы можете сделать:

function uniteUnique() { 
    return Array.prototype.concat.apply([], arrays); 
} 

или даже:

function uniteUnique() { 
    return [].concat.apply([], arrays); 
} 

Это должно работать, так как значение dafaule из Symbol.isConcatSpreadable является false, так concat() действует глубоко ...

+0

Это, трюк, может дать краткое объяснение этому? – Giedrius

+0

Конечно, извините ... Просто добавив некоторые объяснения ... :-) – MarcoS

+0

Жаль, что он не конкретизировал массивы, которые все еще разделены запятой. – Giedrius

0

В соответствии с вашими примерами, которые вы хотите, чтобы сгладить аргументы массива.В ES6 вы можете использовать Rest parameters, чтобы получить аргументы массива и Spread syntax, чтобы выровнять его:

function uniteUnique(...args) { 
    return [].concat(...args); 
} 
0

был в состоянии решить это так,

function uniteUnique(arr) { 
    var myNewArray = [].concat.apply([], Array.prototype.slice.call(arguments)); 
    return myNewArray; 
} 
uniteUnique([1, 3, 2], [1, [5]], [2, [4]]) ; 
Смежные вопросы