Javascript:无法理解Reduce函数中的空初始值设定项

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',

在最终决定联系你们的专家之前,至少盯着这张照片看了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', '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']

  • 替换表达式中的a和v,我们将:

    arr.reduce((a,v)=> ({}['Title',Oliver Twist'][0]=['Title',Oliver Twist'][1]),{},{})

  • [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;
    }, {});
    
    另外,澄清了
    {}