Javascript:无法理解Reduce函数中的空初始值设定项
在最终决定联系你们的专家之前,至少盯着这张照片看了4个小时 新的JS。这个练习的目标是从一些给定的键值对创建一个对象。我采用了一种有效的方法,但是,我很难理解提供的示例解决方案:Javascript:无法理解Reduce函数中的空初始值设定项,javascript,arrays,object,reduce,initializer,Javascript,Arrays,Object,Reduce,Initializer,在最终决定联系你们的专家之前,至少盯着这张照片看了4个小时 新的JS。这个练习的目标是从一些给定的键值对创建一个对象。我采用了一种有效的方法,但是,我很难理解提供的示例解决方案: const object_From_Pairs = arr => arr.reduce((a, v) => ((a[v[0]] = v[1]), a), {}); console.log(object_From_Pairs([['Title', 'Oliver Twist'], ['Author',
const object_From_Pairs = arr => arr.reduce((a, v) =>
((a[v[0]] = v[1]), a), {});
console.log(object_From_Pairs([['Title', 'Oliver Twist'], ['Author', 'Charles Dickens']]));
// Output: {Title: "Oliver Twist", Author: "Charles Dickens"}
我知道如何使用reduce
函数,但我对传递空初始值设定项值(如{}
或[]
)时会发生什么感到困惑
根据,第一次遍历循环时,累加器将是您可以选择提供的初始值设定项值(逗号之后),并且您的值将是您要遍历的数组中第一个项的值
如果这种思路是正确的,那么我的初始a
值应该是{}
,而v
值应该是数组中的第一个子数组,所以['Title',Oliver Twist']
。然而,当我试着完成这些步骤时,我的结果却毫无意义。我的思路是这样的:
arr.reduce((a, v) => ((a[v[0]] = v[1]), a), {})
const object_From_Pairs = arr => arr.reduce((a, v) => {
a[v[0]] = v[1];
return a;
}, {});
a
={}
和v
=['Title','Oliver Twist']
[0]
v的索引值是'Title'
,而[1]
v的索引值是'Oliver Twist'
,因此我们可以将表达式缩短为:
arr.reduce((a,v)=>
({}Title=Oliver Twist),{},{})
reduce
函数之后,我的新累加器或a
值似乎是({}Title=Oliver Twist),{}
,当我第二次尝试将其替换为a
时,这是没有意义的
我错过了什么?
{}
不是初始值设定项吗?{}
是否只是告诉它在{}
中包围结果答案?很难理解如何将其格式化为具有键:值
对的对象 reduce正在做一些稍微复杂的事情。它不仅分配给a
的属性累加器,还返回累加器。此代码:
const object_From_Pairs = arr => arr.reduce((a, v) =>
((a[v[0]] = v[1]), a), {});
相当于:
const object_From_Pairs = arr => arr.reduce((a, v) => {
a[v[0]] = v[1];
return a;
}, {});
这相当于
const object_From_Pairs = arr => {
const a = {};
arr.forEach((v) => {
a[v[0]] = v[1];
// there's no need to do anything with a here
// since the a you want to refer to is already in the outer scope
});
};
空对象是累加器的初始值,累加器在每次迭代时都会为其分配一个属性。对象不会保持为空
我的新累加器或值似乎是({}Title=Oliver Twist),{})
这不是有效的语法。在第二次迭代中,a
的值为
{ Title: 'Oliver Twist' }
因此,运行的回调:
((a[v[0]] = v[1]), a)
就像
let a = { Title: 'Oliver Twist' };
return ((a[v[0]] = v[1]), a)
或者,如果没有令人困惑的逗号运算符:
let a = { Title: 'Oliver Twist' };
a[v[0]] = v[1];
return a;
更妙的是,我强烈建议在这种情况下避免。减少——只是每次累加器的值相同。请使用普通循环arr.forEach
或for(arr的const subar)
对于这种特殊情况,有一个更好的选择,允许将键值子数组数组转换为单个对象:
const object\u From\u Pairs=object.fromEntries;
log(对象来自成对的对象(['Title','olivertwist',['Author','charlesdickens']]);
//输出:{Title:“Oliver Twist”,作者:“Charles Dickens”}
reduce
那里正在做一些稍微复杂的事情。它不仅分配给a
的属性累加器,还返回累加器。此代码:
const object_From_Pairs = arr => arr.reduce((a, v) =>
((a[v[0]] = v[1]), a), {});
相当于:
const object_From_Pairs = arr => arr.reduce((a, v) => {
a[v[0]] = v[1];
return a;
}, {});
这相当于
const object_From_Pairs = arr => {
const a = {};
arr.forEach((v) => {
a[v[0]] = v[1];
// there's no need to do anything with a here
// since the a you want to refer to is already in the outer scope
});
};
空对象是累加器的初始值,累加器在每次迭代时都会为其分配一个属性。对象不会保持为空
我的新累加器或值似乎是({}Title=Oliver Twist),{})
这不是有效的语法。在第二次迭代中,a
的值为
{ Title: 'Oliver Twist' }
因此,运行的回调:
((a[v[0]] = v[1]), a)
就像
let a = { Title: 'Oliver Twist' };
return ((a[v[0]] = v[1]), a)
或者,如果没有令人困惑的逗号运算符:
let a = { Title: 'Oliver Twist' };
a[v[0]] = v[1];
return a;
更妙的是,我强烈建议在这种情况下避免。减少——只是每次累加器的值相同。请使用普通循环arr.forEach
或for(arr的const subar)
对于这种特殊情况,有一个更好的选择,允许将键值子数组数组转换为单个对象:
const object\u From\u Pairs=object.fromEntries;
log(对象来自成对的对象(['Title','olivertwist',['Author','charlesdickens']]);
//输出:{Title:“Oliver Twist”,作者:“Charles Dickens”}
回答!我的主要困惑在于没有意识到表达式的,一部分实际上是返回a的缩写。我一直试图再次将a
的值插入该点,这就是为什么我的结果总是返回一些奇怪的无效语法
我的原始代码行
const object_From_Pairs = arr => arr.reduce((a, v) =>
((a[v[0]] = v[1]), a), {});
可以这样重写:
arr.reduce((a, v) => ((a[v[0]] = v[1]), a), {})
const object_From_Pairs = arr => arr.reduce((a, v) => {
a[v[0]] = v[1];
return a;
}, {});
另外,澄清了{}
是我们传递给a
的初始值
非常感谢@的详尽回答 回答!我的主要困惑在于没有意识到表达式的,一部分实际上是返回a的缩写。我一直试图再次将a
的值插入该点,这就是为什么我的结果总是返回一些奇怪的无效语法
我的原始代码行
const object_From_Pairs = arr => arr.reduce((a, v) =>
((a[v[0]] = v[1]), a), {});
可以这样重写:
arr.reduce((a, v) => ((a[v[0]] = v[1]), a), {})
const object_From_Pairs = arr => arr.reduce((a, v) => {
a[v[0]] = v[1];
return a;
}, {});
另外,澄清了{}
是