reduce将数组合并为单个值

时间:2016-07-06 07:54:07

标签: javascript arrays reduce

我正在阅读article here

  

function reduce(combine, base, array) { forEach(array, function (element) { base = combine(base, element); }); return base; } function add(a, b) { return a + b; } function sum(numbers) { return reduce(add, 0, numbers); } function countZeroes(array) { function counter(total, element) { return total + (element === 0 ? 1 : 0); } return reduce(counter, 0, array); } 通过重复使用将数组元素与基值组合在一起的函数,将数组合并为单个值。这正是sum所做的,因此可以通过使用reduce来缩短它...除了add是一个运算符而不是JavaScript中的函数,所以我们首先必须把它放到一个函数中。

reduce
  • <asp:UpdatePanel ID="UpdatePanel2" runat="server"> <ContentTemplate> <fieldset> <div class="row" id="divSize" runat="server"> <label class="label col col-2">Size</label> <section class="col col-10"> <div id="divMultisize" runat="server" class="inline-group row" > <asp:Repeater ID="rptSizeType" runat="server" OnItemDataBound="rptSizeType_OnItemDataBound"> <ItemTemplate> <section class="col col-12"> <asp:RadioButton ID="rbSize" GroupName="size" runat="server" AutoPostBack="true" Text='<%# Eval("SizeType")%>' class="radiobtn" OnCheckedChanged="rbSizeType_CheckedChanged" ></asp:RadioButton> <asp:Label ID="lblSizeTypeID" runat="server" Visible="false" Text='<%# Eval("SizeTypeID")%>'></asp:Label> </section> </ItemTemplate> </asp:Repeater> <div class="clearfix"></div> <asp:Repeater ID="rptSize" runat="server"> <ItemTemplate> <section class="col col-4"> <label class="checkbox" style="margin-right:0; min-width:0;"> <asp:CheckBox ID="chkSize" runat="server" onclick = "Disable(this)"></asp:CheckBox> <i></i><asp:Label ID="lblSize" runat="server" Text='<%# Eval("Size") %>'></asp:Label> </label> <section class="col col-8"> <label class="input" id="lblQuantity" runat="server"> <asp:TextBox ID="txtQuantity" runat="server" placeholder="Quantity"></asp:TextBox> </label> </section> </section> </ItemTemplate> </asp:Repeater> <div class="clearfix"></div> </div> </section> </div> </fieldset> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="rptSizeType" /> </Triggers> </asp:UpdatePanel> 将数组合并为单个值? :这是否意味着所有元素都得到了总和或多元化?
  • 将数组的元素与基值组合在一起? :组合所有元素或元素?
  • 那位作者试图解释什么?有人可以澄清这个概念吗?

3 个答案:

答案 0 :(得分:2)

reduce操作通过迭代数组并将 accumulator 呈现给自定义回调来工作。无论它想要什么,该回调都可以自由地使用累加器。通常,累加器是回调添加的数字。因此,一组数字将减少为一个数字。

Array.prototype.reduce实际上只是对此的抽象:

var acc = 0;
for (var i = 0; i < arr.length; i++) {
    acc += arr[i];
}

表示为减少:

var acc = arr.reduce(function (acc, n) {
    return acc + n;
});

显然,你不必使用+,你可以做任何其他事情,例如:

var acc = [];
for (var i = 0; i < arr.length; i++) {
    acc.push(arr[i]);
}

var acc = arr.reduce(function (acc, n) {
    acc.push(n);
    return acc;
}, []);

结果是原始数组,没有任何&#34;减少&#34;。 (是的,这是毫无意义的,但证明了你拥有的自由。)

累加器只是该回调在上一次迭代期间返回的值。减少操作继续进行:

  • 回调采用空累加器*和数组的第一个值,返回值
  • 回调接受上一次迭代的返回值和数组的第二个值,返回值
  • [重复数组中的每个元素]
  • reduce吐出最后一次回调的结果作为减少操作的结果

*有关首次迭代行为的详细信息,请参阅API文档。

答案 1 :(得分:1)

Reduce减少了函数列表。它太便宜了,它把它组合成一个单独的值,因为你可以将它减少到一个列表。

Reduce也称为折叠构造功能编程语言。如果你对折叠(https://en.wikipedia.org/wiki/Fold_(higher-order_function))进行一些研究然后尝试回来,它可能会更有意义。

答案 2 :(得分:1)

除了接受的答案,我想指出reduce是一个非常通用的概念。它比mapfilter更通用,因为您可以从reduce推断出它们。

您不仅可以减少Number等原语,还可以减少几乎所有原语。作为一个例子,我举一个减少函数的例子:

const inc = x => x + 1;
const sqr = x => x * x;
let fs = [inc, sqr];

fs.reduce((f, g) => g(f), 2); // 9

这只是功能构成。因此,我们可以利用reduce来组合函数。