Javascript:请帮我理解这个功能

时间:2016-07-08 05:04:56

标签: javascript arrays

我一直试图理解这个功能很长一段时间,但这对我来说没有意义。该函数的目标是删除与其他参数编号匹配的参数数组中的任何数字。

为什么有必要对数组进行切片以使函数起作用?

args.splice(0,1)是多余的吗?我把它删除了,没有任何改变。

似乎过滤功能可以完成大部分工作,但我看不出它是如何实际过滤数字的......

function destroyer(arr) {
  var args = Array.prototype.slice.call(arguments);
  args.splice(0, 1);
  return arr.filter(function(element) {
    return args.indexOf(element) === -1;
  });
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

6 个答案:

答案 0 :(得分:4)

让我们逐行完成:

var args = Array.prototype.slice.call(arguments);

JavaScript的arguments变量类似于数组,但它不是数组。您可以自己尝试:arguments instanceof Array会给出错误。因此,应用Array原型中的slice方法只会将arguments转换为实数数组。

args.splice(0, 1);

这是删除第一个参数,在你的情况下为arr

return arr.filter(function(element) {
  return args.indexOf(element) === -1;
});

这将遍历arr中的所有数字,并将检查它们中的每一个是否存在于参数中。当indexOf()返回-1时,表示在数组中找不到该元素。

答案 1 :(得分:0)

切片不会改变。它返回原始数组中元素的浅表副本。原始数组的元素将复制到返回的数组中。

以此为例

var object = {
'0': 'zero',
'1': 'one',
'2': 'two',
'3': 'three',
'4': 'four',
length: 5
};
var sliced = Array.prototype.slice.call( object, 3 );
 ['three','four']; //output

答案 2 :(得分:0)

我已添加评论,请查看是否有助于您了解该功能。

function destroyer(arr) {
  // arr just holds [1, 2, 3, 1, 2, 3]
  var args = Array.prototype.slice.call(arguments);
  // args contains nested array with all input params [[1, 2, 3, 1, 2, 3], 2, 3]
  args.splice(0, 1);
  //args is spliced and we have [2,3] in args
  //Filter arr=[1, 2, 3, 1, 2, 3] elements, condition it must not be in args i.e [2,3]
  return arr.filter(function(element) {
    return args.indexOf(element) === -1;
  });
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

请参阅以下文档以阅读此函数中使用的参数对象:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/arguments

答案 3 :(得分:0)

  1. passe Arguments [Array [6],2,3]
  2. 拼接后的参数或删除参数的第一个元素 [2,3]
  3. 所以闭包函数过滤元素,该元素存在于具有其他两个元素的数组的第一个元素中。仅返回 [1,1]

答案 4 :(得分:0)

要了解正在发生的事情,我们需要了解Function.prototype.call method

在您传递给它的第一个参数上调用 Array.prototype.slice方法,在这种情况下,它是神奇的JS arguments object,并且然后传递任何参数。

因此Array.prototype.splice是不必要的,你可以写:

function destroyer(arr) {
  var rest = Array.prototype.slice.call(arguments, 1);
  return arr.filter(function(element) {
    return rest.indexOf(element) === -1;
  });
}

事实上,这已经在ES2015 +中使用spread operator实现,所以你可以这样写:

function destroyer(arr, ...rest) {
  return arr.filter(function(element) {
    return rest.indexOf(element) === -1;
  });
}

答案 5 :(得分:0)

arr我们将[1,2,3,1,2,3]和。{ 在args我们将[[1,2,3,1,2,3],2,3] 过滤器函数循环遍历arr 如果args.indexOf(element)不在args中,则element将返回-1。 因此,第一次在循环中元素值为1且内部循环

args.indexOf(1)返回-1,因为args中不存在1,因为在0索引处我们有数组,在第一个索引处我们有2,在第二个索引处我们有3.所以条件=== -1是为true并将1返回到将要打印到控制台的数组。

对于下一个元素,即arr中的2,语句args.indexOf(2)返回存在2的第一个索引,即args数组中的1。同样,整个循环将执行arr