为什么我们在sort(),reduce(),map(),filter()中有函数?

时间:2016-01-17 05:36:45

标签: javascript arrays

有人可以解释为什么Javascript中的这些数组方法有作为参数的功能吗?一个例子是:

newArray = oldArray.map(
 function(val){
  return val + 3;
 });

也是这样,

array.sort(function(a, b) {
 return b - a;
});

我无法理解这些函数及其参数如何在实际的Array方法中发挥作用。

3 个答案:

答案 0 :(得分:4)

首先您需要了解,所有JavaScript函数都是first class,这意味着:

  • 函数是对象类型的实例
  • 函数可以具有属性,并且具有返回其构造函数方法的链接
  • 您可以将该功能存储在变量
  • 您可以将该功能作为参数传递给另一个功能
  • 您可以从函数
  • 返回该函数

on('child_changed')是Array对象的方法,它接受callback function作为参数。

例如:

child_changed

<html>
<head><title>Sheet</title></head>
<body>
<h2 align="center">SKU Selection</h2>
<?php 
$conn=mysqli_connect('localhost','root','');
$db="sample";
mysqli_select_db($conn,$db);
$sql="SELECT DISTINCT(Site) FROM `bom`";
$result=mysqli_query($conn,$sql);
echo "Site Name :";
echo "<select name='Site'>";
echo "<option value='0'>Select Site</option>";
while($row=mysqli_fetch_array($result))
{
echo "<option value='".$row['Site']."'>".$row['Site']."</option>";
}
echo "</select>";

$sql1="SELECT BOM Desc FROM `bom` where Site= ";
$result1=mysqli_query($conn,$sql1);
 echo "<br>";
echo "SKU :";
echo "<select name='SKU'>";
while($row1=mysqli_fetch_array($result1))
{
echo "<option value='".$row1['BOM Desc']."'>".$row1['BOM Desc']."</option>";
}
echo "</select>";

?>
</body>
</html>

reduce(), sort(), map() and filter()

reduce()

var total = [0, 1, 2, 3].reduce(function(a, b) { return a + b; });

sort()

var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu']; items.sort(function (a, b) { return a.localeCompare(b); });

map()

答案 1 :(得分:1)

此回调函数用于定义行为。就像在排序中一样,它将按降序排序数组。这就是你想要如何排序数组或过滤器数组的定义。你可以玩它来更好地理解它,或者MDN有很好的例子。

var arr = [12,23,1,56,4,32];

alert(arr.sort());

alert(arr.sort(function(a,b) {
    return b - a;

}    ));

在第一个示例的情况下,排序方法将通过比较第一个数字进行排序。为了实现正确的排序,我们需要传递自己的逻辑。

您可以通过更改回调函数中的逻辑来对各种不同的排序使用sort。

您提到的其他数组方法也是如此。

在您想要升序的上述示例中,您需要

返回a - b;

答案 2 :(得分:1)

这是函数式编程风格

To(over)简化概念是,这些函数将循环遍历该数组的所有成员。它只会插入你需要的地方传递的功能

以地图

为例

如果你不使用map,你需要写的全部内容是

var oldArray;
var newArray;
for(var i in oldArray){
    if(oldArray[i])
        newArray.push(oldArray[i] + 3);
}

你可以看到我们每次做这样的事情。将改变的是for块中的行。所以他们只是为它做了一个功能

 function map(oldArray,ConvertToSomething){
    var newArray;
    for(var i in oldArray)
        newArray.push(ConvertToSomething(oldArray[i]));
    return newArray;
 }

var array;

//// The function you pass in here will became that ConvertToSomething above
var newArray = map(array,function(val){ if(val) return val + 3; })

很容易。同样适用于sortfiltersort会为您挑选一对。 filtermap类似,但它会创建一个数组,只需返回false或true就可以排除您不想要的内容