2016-01-04 3 views
1

Моя функция должна принимать любое количество списков, а затем выводить их симметричную разницу. sym([1, 2, 3], [5, 2, 1, 4]) должен вернуть [3, 5, 4] и sym([1, 2, 5], [2, 3, 5], [3, 4, 5]) должен вернуть [1, 4, 5]. Как я могу справиться с неизвестным количеством аргументов? Я думал, что я могу использовать единственную переменную args, чтобы создать список списков, но это не работает.Javascript, посвященный нечетному числу аргументов функции

function isin(num,arra) 
{ 
    for (i=0; i<arra.length; i++) 
    { 
    if (num == arra[i]){return true;} 
    } 
    return false; 
} 

function sym(args) { 
    var syms = []; 
    console.log(args); 
    for (i=0; i<args.length; i++) 
    { 
    var ins = false; 
    for (j=0; j<args[i].length; j++) 
    { 
     for (k=i+1; k < args.length; k++) 
     { 
     if(isin(args[i][j], args[k])) 
     { 
      ins = true; 
     } 
     } 
    } 
    if (ins === false) 
    { 
     syms.push(args[i][j]); 
    } 
    } 
    return syms; 
} 
sym([1, 2, 3], [5, 2, 1, 4]); 
+0

Мне нужно передать списки в виде нескольких аргументов – kilojoules

ответ

1

использование arguments, не args

и вам не нужно иметь его в определении функции.

(примечание: Im предполагая, что остальная часть кода работает, как только вы на самом деле получить, что ты Ожидая прошел в)

так:

function sym() { 
    var syms = []; 
    console.log(arguments); 
    for (i=0; i<argumentss.length; i++) 
    { 
    var ins = false; 
    for (j=0; j<arguments[i].length; j++) 
    { 
     for (k=i+1; k < arguments.length; k++) 
     { 
     if(isin(arguments[i][j], arguments[k])) 
     { 
      ins = true; 
     } 
     } 
    } 
    if (ins === false) 
    { 
     syms.push(arguments[i][j]); 
    } 
    } 
    return syms; 
} 
0

Внутри каждой области функций у вас есть доступ к объекту arguments. Все параметры, которые вы передаете, будут доступны внутри него. Вы можете преобразовать объект arguments в массив с помощью Array.prototype.slice.apply (null, arguments) и перебрать его.

1

Для массивов с номерами:

function sym() { 
    var temp = {}, res = []; 

    for (var q=0; q<arguments.length; ++q) { 
    for (var w=0; w<arguments[q].length; ++w) { 
     temp[arguments[q][w]] ^= 1; 
    } 
    } 

    for (var key in temp) { 
    if (temp[key] === 1) { 
     res.push(+key); 
    } 
    } 

    return res; 
} 

console.log(sym([1, 2, 3], [5, 2, 1, 4]), sym([1, 2, 5], [2, 3, 5], [3, 4, 5])) 
+0

Почему вы используете XOR '^'? – kilojoules

+0

@kilojoules, потому что число должно содержаться в нечетном числе массивов, как я полагаю. Также побитовая операция преобразует несуществующее поле в 0. – Qwertiy

1

Es6 представляет rest paramters. Вы можете использовать его вместо объекта arguments.

function logAllArguments(...args) { 
    for (var arg of args) { 
     console.log(arg); 
    } 
} 

logAllArguments(1,2,3) 
Смежные вопросы