Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中编写过滤数组的函数?_Javascript_Arrays - Fatal编程技术网

如何在javascript中编写过滤数组的函数?

如何在javascript中编写过滤数组的函数?,javascript,arrays,Javascript,Arrays,我想写一个函数,在某种条件下过滤数组中的对象。我知道,当您将数组传递给函数时,您对函数内部数组所做的更改也会更改函数外部的数组(如果您首先能够进行区分的话)。比如说, a=[1,2,3] function addItem(list){ list.push(4) } addItem(a) // now a = [1,2,3,4] 此外,即使filter方法只返回一个新数组,而不更改调用它的数组,也可以通过写入a=a.filter(someFunction)来更改该数组。我想这里缺少一些微

我想写一个函数,在某种条件下过滤数组中的对象。我知道,当您将数组传递给函数时,您对函数内部数组所做的更改也会更改函数外部的数组(如果您首先能够进行区分的话)。比如说,

a=[1,2,3]
function addItem(list){
    list.push(4)
}
addItem(a)
// now a = [1,2,3,4]
此外,即使
filter
方法只返回一个新数组,而不更改调用它的数组,也可以通过写入
a=a.filter(someFunction)
来更改该数组。我想这里缺少一些微妙之处,因为当我试图结合这两个事实来编写一个函数,在某种条件下过滤数组时,原始数组根本没有改变。以下是一个例子:

function isEven(n){
    return (n%2 == 0)
}
function filterOdds(list){
    list = list.filter(isEven)
}
a=[1,2,3,4]
filterOdds(a)
// a is still [1,2,3,4]
我想我真的有两个问题:

  • 为什么上述代码没有将
    a
    更改为
    [2,4]
    ?及
  • 我如何编写一个函数来过滤列表,就像我在上面尝试做的那样?当然,您可以在没有函数的情况下完成这项工作,但我真正想要的是在单个函数中过滤多个数组。这似乎是相关的简化

  • 在第二个代码中,您仅重新分配参数。几乎在所有情况下,重新分配变量都不会产生副作用;它所要做的就是更改该范围中对该变量的进一步引用所引用的内容。如果碰巧有一个外部变量作为参数传递,那么不管函数内部发生了什么,该外部变量都不会被重新分配,除非函数故意重新分配外部引用

    您可以通过不传递
    list
    参数-have
    filterOdds
    重新分配外部变量来实现这一点:

    函数isEven(n){
    返回(n%2==0)
    }
    函数filterOdds(){
    list=list.filter(isEven)
    }
    列表=[1,2,3,4]
    filterOdds()
    控制台日志(列表)