MyObject.prototype.reduce回调无法访问数组方法

时间:2019-06-22 19:08:53

标签: javascript arrays callback reduce spread

因此,我正在尝试一些原型制作,并成功在原型上实现forEach以处理其对象数组。箭头函数回调可以正常工作,我认为同样的事情也可以用于.reduce(),但是,正如您所看到的,适用于常规Array的符号不适用于ArraySet原型。顺便说一句,箭头表示法中的相同功能不起作用。

我对这里发生的事情的了解中缺少什么,以便我可以解决此问题并继续前进?

function ArraySet(items) {
  // this._items = []
  this._items = items
}

ArraySet.prototype.forEach = function forEach(cb) {
   return this._items.forEach(cb);
}
  
ArraySet.prototype.reduce = function reduce(cb) {
  return this._items.reduce(cb);
}

let arr = new ArraySet([{
    key1: 'property2',
    key3: 'propertyx'
  },
  {
    key1: 'property4',
    key3: 'propertyy'
  },
  {
    key1: 'climate change',
    key3: 'propertyx'
  },
  {
    key1: 'climate change',
    key3: 'propertyx'
  },
])

arr.forEach(el => {
    console.log(el)
});

x = arr.reduce(function (map, obj) {
    if (obj.key3 === 'propertyx'){
        map.push(obj.key1)
    }
    return map
}, []) //<-- final argument is the instantiating literal of the reigning map type: [], {}, ''

编辑: 多亏了Maheer Ali的回答,详细说明了传播运算符(...)的使用,该问题才得以轻松解决。 Maheer很好地扩展了将应用相同方法的其他功能。

深入研究为什么,我在扩展操作员出现之前就学到了。通常在函数调用中使用.apply()以确保执行过程中所有必需的参数都可用。自从扩展运算符被引入还包括对象以来,它已从适用性演变为数组(如参数列表)。它还可以复制数组,替换arr.splice()。

以下是MDN上示例之一的改编:

function myFunction(v, w, x, y, ...z) {
  console.log(v + ' ' + w + ' ' + x + ' ' + y + ' ' + z)
}
var args = [0, 1];
myFunction(-1, ...args, 2, ...[3, 8]);

参考资料中有更多可用信息:Spread Syntax

1 个答案:

答案 0 :(得分:1)

package com.androidigniter.loginandregistration; import java.util.Date; /** * Created by AndroidIgniter on 23 Mar 2019 020. */ public class User { String username; String fullName; String cardid; Date sessionExpiryDate; public void setUsername(String username) { this.username = username; } public void setFullName(String fullName) { this.fullName = fullName; } public void setCardId(String cardid) { this.cardid = cardid; } public void setSessionExpiryDate(Date sessionExpiryDate) { this.sessionExpiryDate = sessionExpiryDate; } public String getUsername() { return username; } public String getFullName() { return fullName; } public String getCardId() { return cardid; } public Date getSessionExpiryDate() { return sessionExpiryDate; } } 有两个参数,一个是回调,第二个是累加器的初始值。因此,您需要为方法使用rest参数,然后将所有参数传递给reduce()

注意:通常在reduce()中传递第二个参数。在reduce()forEach()中,还有第二个可选参数。该参数将map()绑定到传递给特定方法的回调。如果需要使用该参数,请确保与this

相同

请参见下面的工作片段

reduce()

  

在旁注中,箭头表示法中的相同功能不起作用

箭头函数没有自己的function ArraySet(items) { // this._items = [] this._items = items } ArraySet.prototype.forEach = function forEach(cb) { return this._items.forEach(cb); } ArraySet.prototype.reduce = function reduce(...args) { return this._items.reduce(...args); } let arr = new ArraySet([{ key1: 'property2', key3: 'propertyx' }, { key1: 'property4', key3: 'propertyy' }, { key1: 'climate change', key3: 'propertyx' }, { key1: 'climate change', key3: 'propertyx' }, ]) arr.forEach(el => { console.log(el) }); x = arr.reduce((map, obj) => { if (obj.key3 === 'propertyx'){ map.push(obj.key1) } return map }, []) //<-- final argument is the instantiating literal of the reigning map type: [], {}, '' console.log(x)绑定。他们使用父级范围的this。由于您在方法中使用this,因此无法使用Arrow函数。原型方法永远无法使用箭头功能编写。