gpt4 book ai didi

javascript - 如何使用 Ramda 按索引求和 n 数组

转载 作者:行者123 更新时间:2023-12-02 15:24:48 26 4
gpt4 key购买 nike

我一直在学习 Ramda,想知道如何按索引对 n 数组求和。下面是我可以用 2 个数组做的事情。我怎样才能使这个方法规模化?

即我希望能够做到这一点:sumByIndex( arr1, arr2, ..., arrn )

给定列表 xy ,结果数组应该产生 [x0 + y0, x1 + y1, ..., xn + yn] 。因此,对于n-array的情况,结果数组应该是 [ a[0][0] + a[1][0] + ... a[n][0], a[0][1] + a[1][1] + ... a[n][1], ..., a[0][n] + a[1][n] + ... + a[n][n] ]哪里a[n]是一个数组,作为位置 n 处的参数.

var array1 = [1,2,3];
var array2 = [2,4,6];

var sumByIndex = R.map(R.sum);
var result = sumByIndex(R.zip(array1, array2));

$('pre').text(JSON.stringify(result, true));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.18.0/ramda.min.js"></script>
<pre></pre>

最佳答案

为了实现这一目标,我们将首先创建一些通用辅助函数:

// a new version of `map` that includes the index of each item
var mapI = R.addIndex(R.map);

// a function that can summarise a list of lists by their respective indices
var zipNReduce = R.curry(function(fn, lists) {
return mapIndexed(function (_, n) {
return fn(R.pluck(n, lists));
}, R.head(lists));
});

一旦我们有了这些,我们就可以通过将 R.sum 传递给上面定义的 zipNReduce 来创建 sumByIndex

var sumByIndex = zipNReduce(R.sum);
sumByIndex([[1, 2, 3], [4, 5, 6], [7, 8, 9]]); // [12, 15, 18]

如果您希望创建一个接受不同数量的数组作为参数而不是数组的数组的函数,您可以简单地用 R.unapply 包装它:

var sumByIndex_ = R.unapply(sumByIndex);
sumByIndex_([1, 2, 3], [4, 5, 6], [7, 8, 9]); // [12, 15, 18]

如果您可能要处理不同大小的列表,我们可以稍微改变一下 R.sum ,将未定义的值默认为零:

var sumDefaultZero = R.reduce(R.useWith(R.add, [R.identity, R.defaultTo(0)]), 0);
var sumByIndexSafe = zipNReduce(sumDefaultZero);
sumByIndexSafe([[1, 2, 3], [], [7, 9]]); // [8, 11, 3]

关于javascript - 如何使用 Ramda 按索引求和 n 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33771417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com