function.apply(argument1,array)不能从数组中获取所有值

时间:2019-02-16 09:24:07

标签: javascript

let result = { amount_2 : "1000", amount_3 : "1200", date_2 : "15/2/2019", date_3 : "15/3/2019", modeOfPayment_2: "Cash", modeOfPayment_3: "Cash", note_2 : "áßðáßðáßð↵áß", note_3 : "", refNum_2 : "11111", refNum_3 : "Fffff", submittedByID_2: "T62tgJcjieSJsAEJT69VfpRc5Mw2", submittedByID_3: "T62tgJcjieSJ" }; /* Compose Object.values() and Object.entries() with reduce. Here we get the key/value pairs (entries) of the input "results" object, and reduce the key/values into an object of nsted objects of key/values grouped by number. We then aquire an array of the grouped objects using Object.values() */ const groupedResult = Object.values(Object.entries(result).reduce((output, [key,value]) => { /* Extract key and number parts of current entry of result object */ const [, name, number] = key.match(/^(.*)_(\d+)$/); /* Fetch or insert (empty) object for the number corresponding to this entries key */ const group = output[ number ] = output[ number ] || {} /* Compose a key with number suffix and insert value into group object for composed key */ group[ `${name}${ number }` ] = value; /* Return current output object for next iteration of reduce */ return output; }, {})) console.log(groupedResult);未在我的数组中注册第一个参数(索引0)。

我尝试了剩余/扩展语法,并且 下面的代码似乎可以正常工作:

function.apply

但是以下代码在显式绑定let sayName = function (object, ...languages) { console.log(`My name is ${this.name} and I speak ${languages.join(', ')}`); }; let stacy = { name: 'Stacy', age: 34 }; let languages = ['Javascript', 'CSS', 'German','English', 'Spanish']; sayName(stacy, ...languages); 下不起作用:

function.apply

结果总是从数组中删除0索引,即输出中不包含“ Javascript”。

我在做什么错了?

1 个答案:

答案 0 :(得分:3)

您的函数似乎期望使用apply参数,但是看到如何使用apply调用它是不正确的。当您调用callthis时,该方法的第一个参数用于为函数的执行上下文设置this的值。它不会作为参数传递。

当函数引用this时,正确设置apply很重要,因此使用calllet sayName = function (object, ...languages) { 是个不错的选择。

所以改变:

let sayName = function (...languages) {

收件人:

object

请注意,您的函数代码中始终没有使用apply

在不调用sayName(stacy, ...languages); 而是直接调用函数的版本中,您可以这样做:

this

...但是这里call对象的设置不正确。您应该使用this来确保stacy将引用sayName.call(stacy, ...languages);

function.apply(thisArg, [argsArray])

查看apply的文档:

  

语法

this
     

参数

     

thisArg

     

可选。为调用 func 提供了sayName的值。 [...]

     

argsArray

     

可选。类似于数组的对象,指定应调用 func 的参数。 [...]

面向对象的编程,一种更好的方法

现在,退后一步,您实际上应该已经将stacy定义为原型方法,并像这样构造class Person { constructor(name, age) { this.name = name; this.age = age; } sayName(...languages) { console.log(`My name is ${this.name} and I speak ${languages.join(', ')}`); } } let stacy = new Person('Stacy', 34); let languages = ['Javascript', 'CSS', 'German','English', 'Spanish']; stacy.sayName(...languages);

console.log

...,以及为什么不实际将一个人说的语言也作为属性存储,并从方法中删除class Person { constructor(name, age) { this.name = name; this.age = age; this.languages = []; } speaks(...languages) { this.languages = languages; } introduction() { return `My name is ${this.name} and I speak ${this.languages.join(', ')}`; } } let stacy = new Person('Stacy', 34); stacy.speaks('Javascript', 'CSS', 'German','English', 'Spanish'); console.log(stacy.introduction());,因为应该由调用者决定在何处进行输出(也许是文件或HTML元素):

{{1}}