【问题标题】:How to make reduce add all the items into the array?如何使reduce将所有项目添加到数组中?
【发布时间】:2020-07-21 17:18:53
【问题描述】:

我有一个数据文件,我必须使用 reduce() 方法将其转换为另一种格式,我已经编写了代码,但它没有添加所有项目...

数据文件: data.txt

Joey    Pizza    2
Joey    Sandwich    1
Joey    Burger    2
Chandler    Pizza    1
Chandler    Sandwich    0
Chandler    Burger    1

预期结果

{
  "Joey": [
    {
      "Ordername": "Pizza",
      "Quantity": "2"
    },
    {
      "Ordername": "Sandwich",
      "Quantity": "1"
    },
    {
      "Ordername": "Burger",
      "Quantity": "2"
    }
  ],
  "Chandler": [
    {
      "Ordername": "Pizza",
      "Quantity": "1"
    },
    {
      "Ordername": "Sandwich",
      "Quantity": "0"
    },
    {
      "Ordername": "Burger",
      "Quantity": "1"
    }
  ]
}

我写的代码:

code.js

const fs = require('fs');

var output = fs
    .readFileSync('data.txt', 'utf8')
    .trim()
    .split('\n')
    .map((line) => line.split('    '))
    .reduce((acc, item) => {
        acc[item[0]] = [];
        acc[item[0]].push({ Ordername: item[1], Quantity: item[2] });
        return acc;
    }, {});

console.log(JSON.stringify(output, null, 2));

在运行上面的代码时,它会给出这个结果

{
  "Joey": [
    {
      "Ordername": "Burger",
      "Quantity": "2\r"
    }
  ],
  "Chandler": [
    {
      "Ordername": "Burger",
      "Quantity": "1"
    }
  ]
}

为什么只将第三项添加到数组中而不是全部三个项?

【问题讨论】:

  • 这个acc[item[0]] = [];应该是acc[item[0]] = acc[itiem[0]] || [];

标签: javascript node.js functional-programming


【解决方案1】:

这是因为您总是用名称覆盖键:

acc[item[0]] = [];

你应该做类似的事情

if(!acc[item[0]]) {
  acc[item[0]] = []
}

acc[item[0]].push(...)

【讨论】:

  • 虽然你的解决方案是正确的,但这可以是一个捷径:acc[item[0]] = acc[itiem[0]] || []
  • 如果您正在寻找一个简短的解决方案,那么是的,那也很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多