【问题标题】:Array to object reduce数组到对象减少
【发布时间】:2018-09-03 07:31:13
【问题描述】:

您好,我想将数组转换为对象

输入 = [1,2,3]

预期输出 = {1:1,2:2,3:3}

我试过了

const arrToObj = (arr) => {
  arr.reduce((acc, curr, i, arr)=> {
    acc[curr]=arr[i]
  },{})
}
console.log(arrToObj([1,2,3,4,5,6,7,8,9]))

但它会在第二次迭代中引发错误。 出了什么问题以及如何使其发挥作用?

【问题讨论】:

标签: javascript arrays object reduce


【解决方案1】:

这样的?

const arr = [1,2,3,4,5,6,7,8,9]
const obj = arr.reduce((accumulator, currentValue, index) => {
  accumulator[index+1] = currentValue;
  return accumulator;
}, {});

console.log(obj)

【讨论】:

  • 是的,它有效,但我想使用 reduce 来实现
  • 谢谢。我注意到我没有在我的代码中返回 acc,这是错误的原因
【解决方案2】:

到目前为止你所尝试的有两个问题

第一个是严重的:

你忘了从你的累加函数返回,所以它返回undefined

它第二次抛出,因为Array.prototype.reduce 在第一次调用累加函数时将指定的种子作为第一个参数传递,但在第二次调用时,它传递了第一次调用的结果。

所以最初,reduce 像这样调用你的函数

result = accumulatorFunction(seed, arr[0], 0, arr);

扩展为

result = accumulatorFunction({}, 1, 0, [1, 2, 3]);

然而,随后的调用看起来像这样

result = accumulatorFunction(result, arr[1], 1 arr);

扩展为

result = accumulatorFunction(undefined, 2, 1, [1, 2, 3]);

所以你需要写类似的东西

arr.reduce((acc, curr, i, arr) => {
  acc[curr] = arr[i];
  return acc;
}, {});

您的代码的另一个问题,更多是样式问题,是您不必要地提供和使用传递给累加函数的第四个参数。无论如何,这个参数只是数组本身。使用它很麻烦,并且会使您的代码更复杂、更容易出错并且更难理解。

改为写

arr.reduce((acc, curr) => {
  acc[curr] = curr;
  return acc;
}, {});

"use strict";

const input = [1, 2, 3];

const output = input.reduce((acc, curr) => {
  acc[curr] = curr;
  return acc;
}, {});

console.log(output);

【讨论】:

    【解决方案3】:

    const arrToObj = a => a.reduce((r, v) => (r[v] = v, r), {})
    
    console.log( arrToObj( [1, 2, 3] ) )

    如果值与索引匹配,则使用 E​​CMAScript 2018 Spread syntax 会更简单:

    console.log( { ...[, 1, 2, 3] } )

    【讨论】:

    • ECMAScript 2018 语法在这个例子中看起来很酷。感谢您的回答!
    • 这是一种优雅的方法,但您链接到了错误的文档。数组传播与对象传播不同
    • @AluanHaddad 它是扩展语法的通用,所以它涵盖了函数调用、数组和对象。
    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2016-12-10
    • 2018-09-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多