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”。
我在做什么错了?
答案 0 :(得分:3)
您的函数似乎期望使用apply
参数,但是看到如何使用apply
调用它是不正确的。当您调用call
或this
时,该方法的第一个参数用于为函数的执行上下文设置this
的值。它不会作为参数传递。
当函数引用this
时,正确设置apply
很重要,因此使用call
或let 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}}