Javascript 使用first-last和map实现Reduce

Javascript 使用first-last和map实现Reduce,javascript,arrays,object,methods,Javascript,Arrays,Object,Methods,我偶然发现了这段旨在重新定义Array.prototype.reduce的代码: 函数优先(数组,n){ 返回n==未定义的数组[0]:array.slice(0,n); }; 最后一个函数(数组,n){ if(n>array.length){ 返回数组; }否则{ 返回n==未定义的数组[array.legnth-1]:array.slice(array.length-n,array.length); }; 函数映射(集合、迭代器){ var-arr=[]; 每个(集合、函数(元素、索引)

我偶然发现了这段旨在重新定义Array.prototype.reduce的代码:

函数优先(数组,n){
返回n==未定义的数组[0]:array.slice(0,n);
}; 
最后一个函数(数组,n){
if(n>array.length){
返回数组;
}否则{
返回n==未定义的数组[array.legnth-1]:array.slice(array.length-n,array.length);
};
函数映射(集合、迭代器){
var-arr=[];
每个(集合、函数(元素、索引){
arr.push(迭代器(元素、索引);
});
返回arr;
};
下面是关于
reduce()
函数的逐行说明:

第1行:如果没有为
acc
传递值,则将其设置为集合中的第一个值

第2行:对集合调用
map()
,它将在集合上迭代,调用对集合的每个项调用
rf()
的回调。
map()
创建一个新数组,该数组是每次调用迭代回调时返回值的集合。在从
map()
返回的结果数组上,从该数组获取
last()
值,并从
reduce()
返回该值作为最终返回结果

第3行:将
acc
设置为
rf(acc,value)
的结果

第4行:从
map()
将放入数组的回调返回
acc

但是,我不明白array.last()在这里做什么。可以吗 请有人解释一下

假设您的意思是
last(array)
,则
last(array)
的功能是获取数组中的最后一项。如果将第二个参数传递给
last()
,则它将从传入的数组中获取最后N项,并将其作为新数组返回(您不使用第二个功能)


reduce()
的实现似乎不应该使用
map()
,因为创建这个内部数组没有意义。我认为这样会更有效:

function reduce(collection, rf, initial) {
    var acc = (initial === undefined) ? first(collection) : initial;
    each(collection, function(value) {
        acc = rf(acc, value);
    });
    return acc;
}

如果要更准确地模拟
Array.prototype.reduce()
,如果未选择初始值,则使用数组中的第一个元素作为初始值,并且不为数组中的第一个元素调用迭代器,则可以执行以下操作:

function reduce(collection, rf, initial) {
    var acc = initial, index = 0;
    if (initial === undefined) {
        acc = collection[0];
        index = 1;
    }
    for (; index < collection.length; ++index) {
        acc = rf(acc, collection[index]);
    });
    return acc;
}
功能减少(采集、射频、初始){
var acc=初始值,指数=0;
如果(初始===未定义){
acc=集合[0];
指数=1;
}
对于(;索引
Array没有本机
last
函数。除非它也是Array原型的扩展。根据您的代码,没有
Array.last()
调用,我只能看到一个
last
函数。last所做的是在javascript作用域中实现的。您可以自己找到它。定义了
last
的位置您必须向我们显示
first()
last()
map()
函数,因为它们不是标准的Javascript。我们可以猜测它们的作用,但如果我们不必猜测,这里的答案会更好。此外,您还询问了
array.last()
,但您的代码中没有类似的内容。请花些时间编写/编辑一个清晰的问题,其中包含所有必要的信息,以了解您在问什么以及您的情况。现在,这个问题将以“不清楚您在问什么”结束因为里面没有足够的信息。@jfriend00谢谢你的评论。我已经添加了你要求的信息。谢谢你查看。在
last()
中,
length
这一行的拼写错误:
array[array.legnth-1]
非常感谢您花时间解释。我同意。当您已经有了回调时,在此处使用map似乎是多余和不必要的。使用每种方法似乎都是进行此操作的理想方式。快速提问-如果您正在迭代整个集合,则不会重复集合[0]。是否要迭代两次?@IvonneTerrero-是的,它会。这不是Javascript的
Array.prototype.reduce()的行为
,但您没有提供所需行为的规范,因此我没有更改该方面的内容。@ivonneterro-因为您可能是新来的,如果这回答了您的问题,那么您可以通过单击最佳答案旁边的绿色复选标记向社区表明这一点。这也会为您赢得一些声誉分数r遵循正确的过程。@IvonneTerrero-I添加了一个替代实现。
function reduce(collection, rf, initial) {
    var acc = initial, index = 0;
    if (initial === undefined) {
        acc = collection[0];
        index = 1;
    }
    for (; index < collection.length; ++index) {
        acc = rf(acc, collection[index]);
    });
    return acc;
}