我正在阅读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>
将数组合并为单个值? :这是否意味着所有元素都得到了总和或多元化?答案 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
是一个非常通用的概念。它比map
或filter
更通用,因为您可以从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来组合函数。