2013-03-02 2 views
-1

Я хочу написать функцию, которая вернет объединение переданных аргументов массива.Javascript: объединение нескольких аргументов

Я не хочу использовать декрементирующую инструкцию while или функцию подчеркивания _.union.

союз ([1,4,78,98], [45,56,3], [2,3,45]);

возвращается -> [1,4,78,98,45,56,2]

Это то, что я до сих пор, и это не правильно:

union: function(){ 
     var i, j, k; 
     var newArray = []; 

     for(i = 0; i < arguments.length; i++){ 
     j = arguments[i]; 
     l = k[arguments[i]]; 
      for(){ 
       j = k[i]; 
       newArray.push(j); 
      } 
     } 
      return newArray; 
     } 

Я надеялся, Я могу найти решение с несколькими циклами.

+2

Что результат вы получите? Почему это неправильно? –

ответ

1

Идея состоит в том, чтобы сгладить, а затем удалить дубликаты. В функциональном стиле вы могли бы сделать что-то вроде этого:

function union() { 
    var arrs = [].concat.apply([], arguments); 
    return arrs.filter(function(v, i) { 
    return arrs.indexOf(v) == i; 
    }); 
} 

Это должно дать вам тот же результат, как и Подчеркивание-х union.

Демо:http://jsbin.com/azulok/1/edit

0

Вы можете использовать .reduce().

union([1,4,78,98],[45,56,3],[2,3,45]); 

function union() { 
    return [].reduce.call(arguments, function(res, arr) { 
     return res.concat(arr.filter(function(item) { 
             return res.indexOf(item) === -1; 
            })) 
    }) 
} 

разбить его немного, если вы предпочитаете:

function union() { 
    return [].reduce.call(arguments, function(res, arr) { 
     return res.concat(arr.filter(notIn(res))) 
    }) 
} 

function notIn(arr) { 
    return function(item) { 
     return arr.indexOf(item) === -1; 
    } 
} 

И, конечно, вы можете повторно использовать .reduce() обратного вызова, а также, так что если вы на самом деле массив Массивы, вы можете сделать это:

var res = arrays.reduce(joinUnique); 

function joinUnique(res, arr) { 
    return res.concat(arr.filter(notIn(res))) 
} 

function notIn(arr) { 
    return function(item) { 
     return arr.indexOf(item) === -1; 
    } 
} 
0

Самый простой способ сделать это - использовать Set.

const data = new Set([...[1,4,78,98], ...[45,56,3], ...[2,3,45]]); 
 

 
data.forEach(i => console.log(i));

Смежные вопросы