2017-05-30 45 views
0

许多我有是应该从参数JavaScript程序返回,而不是所需的阵列

function destroyer(arr) { 
    var args = [].slice.call(arr); 
    var data = args.shift(); 
    for(var i = 0; i < args.length; i++){ 
    var j = 0; 
    while(j < data.length){ 
     if(args[i] == data[j]){ 
     data.splice(j,1); 
     j = 0; 
     } 
     else{ 
     j += 1; 
     } 
    } 
    } 
    return data; 
} 

一个列表中删除项的程序破坏者([1,2,3,1,2,3], 2,3)应该返回[1,1],但我只得到1的响应,我不知道为什么,因为当我在循环外部执行指令时,我得到数组。

更新:应该看起来像这样。

function destroyer(arr) { 
    var args = [].slice.call(arguments); 
    var data = args[0]; 
    args.shift(); 
    for(var i = 0; i < args.length; i++){ 
    var j = 0; 
    while(j < data.length){ 
     if(args[i] == data[j]){ 
     data.splice(j,1); 
     j = 0; 
     } 
     else{ 
     j += 1; 
     } 
    } 
    } 
    // Remove all the values 
    return data; 
} 
+0

它返回1,因为 '破坏者([1,2,3,1,2,3],2,3)'套'args'是'[1,2 ,3,1,2,3]',那么你将数据设置为'args.shift()',它将'args'移到'[2,3,1,2,3]',但将'data'设置为'1' – Alexander

+0

[Array.prototype.shift](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift?v=control)返回已移除的元素。 – Hodrobond

+2

也许你的意思是'var args = [] .slice.call(arguments);' - 当你的代码站立时,参数2和3永远不会被引用(使用es6,你也可以将函数定义更改为'function destroyer(.. .arr){'为了得到你期望的结果 –

回答

0

作为替代方案,可以使用spread syntax获得元素的数组删除并Array.prototype.filter过滤掉这些元素,像这样

function destroyer(arr, ...args) { 
    return arr.filter(e => !args.includes(e)); 
} 

console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3)); // [1, 1] 
+0

谢谢!我想使用过滤器,但是我工作的IDE没有考虑arr.filter函数,因为某些原因 –

0

您应该使用spread syntax来表明,将有更多参数

function destroyer(...arr) { 
 
    var args = [].slice.call(arr); 
 
    var data = args.shift(); 
 
    for(var i = 0; i < args.length; i++){ 
 
    var j = 0; 
 
    while(j < data.length){ 
 
     if(args[i] == data[j]){ 
 
     data.splice(j,1); 
 
     j = 0; 
 
     } 
 
     else{ 
 
     j += 1; 
 
     } 
 
    } 
 
    } 
 
    return data; 
 
} 
 

 
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

0

又一变体。

function destroyer(array) { 
 
    var pos, args = [].slice.call(arguments, 1), 
 
    arrLength = array.length, 
 
    newArray = []; 
 
    
 
    while ((arrLength -= 1) >= 0) { 
 
    pos = args.lastIndexOf(array[arrLength]); 
 
    if (!~pos) { 
 
     newArray.unshift(array[arrLength]); 
 
    } 
 
    } 
 

 
    return newArray; 
 
}; 
 

 
console.log(destroyer([1,2,3,1,2,3], 2, 3)); 
 
console.log(destroyer([1,2,3,1,2,3], 1, 3)); 
 
console.log(destroyer([1,2,3,1,2,3], 1, 2)); 
 
console.log(destroyer([1,2,3,1,2,3], 1, 2, 3)); 
 
console.log(destroyer([1,2,3,1,2,3], 4));

相关问题