使用 lodash 重塑 JSON 并减少

2023-11-30

我想根据从 URL 下载的已解析 CSV 文件重塑 JSON。

我使用“csvtojson”模块来解析 CSV 并创建需要重新整形的 JSON。

下面是我的完整代码:

const _ = require('lodash')
// to handle datetimes
const moment = require('moment')
// to convert csv to json
const csv = require('csvtojson')

// to save files to disk
const fs = require('fs')
const fsPromises = fs.promises;
const path = require('path')

// to load data stream from url
const axios = require('axios')

// to schedule downloading
const schedule = require('node-schedule');
//let t = moment('2020-01-30 02:59:59+01')
// console.log(t.format())
// console.log(t.toDate())

const urlBaseFile = 'http://cemec.arpacampania.it/meteoambientecampania/php/downloadFileDati.php?path=/var/www/html/meteoambientecampania/prodotti/aria/arpac_dati_centraline'

const path_fileJSON = path.resolve(__dirname, '../data.json')
const path_fileCSV = path.resolve(__dirname, '../data.csv')

const downloadCSV = async (date) => {

    const url = urlBaseFile + '_' +
        (!date ? moment().format('YYYYMMDD') : date) + '.csv'

    const writerCSV = fs.createWriteStream(path_fileCSV)

    try {
        let response = await axios.get(url, {
            responseType: 'stream'
        })
        await response.data.pipe(writerCSV)
        const json_from_csv = await response.data.pipe(csv())
        const json_from_csv_filtered = json_from_csv.filter(d => d.descrizione == 'Portici Parco Reggia').map(d => {
            return {
                // convert to Date object UTC format
                // moment(d.data_ora).format()
                datetime: moment(d.data_ora).toISOString(),
                [d.inquinante]: parseFloat(d.valore),
                // pollutant: d.inquinante,
                // value: parseFloat(d.valore), // convert to float
                //unit: d.um
            }
        })

        await fsPromises.writeFile(path_fileJSON, JSON.stringify(json_from_csv_filtered, null, 4))

        const res = json_from_csv_filtered.reduce((acc, val) => {
            const find = acc.find(el => el.date === val.datetime.substring(0, 10));
            const {
                datetime,
                ...obj
            } = val;

            if (find) {
                find.values[0] = {
                    ...find.values[0],
                    ...obj
                };
            } else {
                acc.push({
                    date: datetime.substring(0, 10),
                    values: [{
                        t: datetime,
                        ...obj
                    }]
                });
            }
            return acc;
        }, []);
        console.log(JSON.stringify(res, null, 4))



    } catch (err) {

        console.error(err)
    }



}

downloadCSV()

我得到:

[
    {
        "date": "2020-06-28",
        "values": [
            {
                "t": "2020-06-28T23:59:59.000Z",
                "Benzene": 0.5,
                "NO2": 44.7,
                "O3": 23.2
            }
        ]
    },
    {
        "date": "2020-06-29",
        "values": [
            {
                "t": "2020-06-29T00:59:59.000Z",
                "Benzene": 4.3,
                "NO2": 11.5,
                "O3": 67.8
            }
        ]
    }
]

整体 JSON 架构是正确的,但我应该获取日期 2020-06-29 的其他项目,而仅返回 1 个项目。

怎么了?

Thanks.


来自post和您的评论我假设您的响应数据将类似于下面的内容,据我从您的评论中了解到,您希望按日期对值进行分组datetime然后将多个对象放入values根据不同时间分组的数组。我尝试过lodash groupBy功能。为了解决问题,我采用了两种分组方式

  1. 按日期分组 from datetime
  2. 时间组值每组日期

let data = [
    {
        "datetime": "2020-06-29T23:59:59.000Z",
        "Benzene": 1.9
    },
    {
        "datetime": "2020-06-30T00:59:59.000Z",
        "Benzene": 0.6
    },
    {
        "datetime": "2020-06-30T01:59:59.000Z",
        "Benzene": 5.7
    },
    {
        "datetime": "2020-06-30T02:59:59.000Z",
        "Benzene": 5.5
    },
    {
        "datetime": "2020-06-30T03:59:59.000Z",
        "Benzene": 5.2
    },
    {
        "datetime": "2020-06-30T04:59:59.000Z",
        "Benzene": 1
    },
    {
        "datetime": "2020-06-30T05:59:59.000Z",
        "Benzene": 2.1
    },
    {
        "datetime": "2020-06-30T06:59:59.000Z",
        "Benzene": 4.2
    },
    {
        "datetime": "2020-06-30T07:59:59.000Z",
        "Benzene": 3.4
    },
    {
        "datetime": "2020-06-30T00:59:59.000Z",
        "NO2": 16.3
    },
    {
        "datetime": "2020-06-30T01:59:59.000Z",
        "NO2": 12.6
    },
    {
        "datetime": "2020-06-30T02:59:59.000Z",
        "NO2": 11.7
    },
    {
        "datetime": "2020-06-30T03:59:59.000Z",
        "NO2": 35.5
    },
    {
        "datetime": "2020-06-30T04:59:59.000Z",
        "NO2": 44.6
    },
    {
        "datetime": "2020-06-30T05:59:59.000Z",
        "NO2": 19.9
    },
    {
        "datetime": "2020-06-30T06:59:59.000Z",
        "NO2": 11.2
    },
    {
        "datetime": "2020-06-30T07:59:59.000Z",
        "NO2": 8.2
    },
    {
        "datetime": "2020-06-29T23:59:59.000Z",
        "O3": 25.6
    },
    {
        "datetime": "2020-06-30T01:59:59.000Z",
        "O3": 31.7
    },
    {
        "datetime": "2020-06-30T02:59:59.000Z",
        "O3": 35.1
    },
    {
        "datetime": "2020-06-30T03:59:59.000Z",
        "O3": 11.4
    },
    {
        "datetime": "2020-06-30T04:59:59.000Z",
        "O3": 4.9
    },
    {
        "datetime": "2020-06-30T05:59:59.000Z",
        "O3": 32.8
    },
    {
        "datetime": "2020-06-30T06:59:59.000Z",
        "O3": 46.4
    },
    {
        "datetime": "2020-06-30T07:59:59.000Z",
        "O3": 55.6
    }
];
const groupsByDate = _.groupBy(data, val => val.datetime.split('T')[0]);
const res = Object.entries(groupsByDate).map(([date, vals]) => {
  const groupsByTime = _.groupBy(vals, val => val.datetime.split('T')[1]);
  return {
    date,
    values: Object.values(groupsByTime).map(arr => Object.assign({}, ...arr))
  };
});

console.log(JSON.stringify(res, null, 2));
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>

我还尝试将我的解决方案放入您当前的方法中

const json_from_csv_filtered = [
    {
        "datetime": "2020-06-29T23:59:59.000Z",
        "Benzene": 1.9
    },
    {
        "datetime": "2020-06-30T00:59:59.000Z",
        "Benzene": 0.6
    },
    {
        "datetime": "2020-06-30T01:59:59.000Z",
        "Benzene": 5.7
    },
    {
        "datetime": "2020-06-30T02:59:59.000Z",
        "Benzene": 5.5
    },
    {
        "datetime": "2020-06-30T03:59:59.000Z",
        "Benzene": 5.2
    },
    {
        "datetime": "2020-06-30T04:59:59.000Z",
        "Benzene": 1
    },
    {
        "datetime": "2020-06-30T05:59:59.000Z",
        "Benzene": 2.1
    },
    {
        "datetime": "2020-06-30T06:59:59.000Z",
        "Benzene": 4.2
    },
    {
        "datetime": "2020-06-30T07:59:59.000Z",
        "Benzene": 3.4
    },
    {
        "datetime": "2020-06-30T00:59:59.000Z",
        "NO2": 16.3
    },
    {
        "datetime": "2020-06-30T01:59:59.000Z",
        "NO2": 12.6
    },
    {
        "datetime": "2020-06-30T02:59:59.000Z",
        "NO2": 11.7
    },
    {
        "datetime": "2020-06-30T03:59:59.000Z",
        "NO2": 35.5
    },
    {
        "datetime": "2020-06-30T04:59:59.000Z",
        "NO2": 44.6
    },
    {
        "datetime": "2020-06-30T05:59:59.000Z",
        "NO2": 19.9
    },
    {
        "datetime": "2020-06-30T06:59:59.000Z",
        "NO2": 11.2
    },
    {
        "datetime": "2020-06-30T07:59:59.000Z",
        "NO2": 8.2
    },
    {
        "datetime": "2020-06-29T23:59:59.000Z",
        "O3": 25.6
    },
    {
        "datetime": "2020-06-30T01:59:59.000Z",
        "O3": 31.7
    },
    {
        "datetime": "2020-06-30T02:59:59.000Z",
        "O3": 35.1
    },
    {
        "datetime": "2020-06-30T03:59:59.000Z",
        "O3": 11.4
    },
    {
        "datetime": "2020-06-30T04:59:59.000Z",
        "O3": 4.9
    },
    {
        "datetime": "2020-06-30T05:59:59.000Z",
        "O3": 32.8
    },
    {
        "datetime": "2020-06-30T06:59:59.000Z",
        "O3": 46.4
    },
    {
        "datetime": "2020-06-30T07:59:59.000Z",
        "O3": 55.6
    }
];
const groupBy = (xs, f) => {
  return xs.reduce((acc, val) => {
          const key = f(val);
          const values = [...(acc[key] || []), val];
          acc[key] = values;
          return acc;
      }, {});
}

const groupsByDate = groupBy(json_from_csv_filtered, v => v.datetime.split("T")[0]);
const res = Object.entries(groupsByDate).map(([date, values]) => {
  const groupsByTime = groupBy(values, v => v.datetime.split("T")[1]);
  return {
    date,
    values: Object.values(groupsByTime).map(v => Object.assign({}, ...v))
  };
});
console.log(JSON.stringify(res, null, 2));

检查该方法,我希望它能根据我的理解解决您的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 lodash 重塑 JSON 并减少 的相关文章

  • Google javascript 登录 api:无法离线访问

    我正在尝试为服务器端应用程序实现 Google 登录 如 Google 文档中所示 服务器端应用程序的 Google 登录 https developers google com identity sign in web server si
  • ELEMENT.style.color 在 IE 中不起作用

    在一个小型 Web 应用程序中 我使用 JavaScript 在文本框中设置一些文本及其颜色 在下面的片段中 el 是我的对象 这段代码在 Firefox Opera 和 Safari 下产生了正确的效果 但在 IE 下却没有这样的运气 我
  • 匹配 JavaScript RegEx 中的不可见字符

    我有一些包含不可见字符的字符串 但它们位于可预测的位置 通常 围绕我想要提取的文本片段 然后在第二次出现之后我想保留文本的其余部分 我似乎不知道如何关闭隐形字符 and将它们从我的结果中排除 为了匹配隐形 我一直在使用这个正则表达式 xA0
  • 如何从许多相似的名称中标准化城市名称

    我从第三方 API 获取城市名称 该 API 不返回规范化的城市名称 例如 有时其San Francisco 有时它的San Francisco CA 有时它的San Francisco USA 我不需要街道地址等 我只需要将城市名称规范化
  • Express.js - 监听关闭

    我有一个使用 Express 的 Node js 应用程序 在该应用程序中 我有一个如下所示的块 const app require app const port process env PORT 8080 const server app
  • 在 C# 中反序列化 JSON 日期时出现问题 - 添加 2 小时

    将 JSON 日期反序列化为 C DateTime 时 我们遇到了一个棘手的问题 代码是 JavaScriptSerializer serializer new JavaScriptSerializer jsonTrechos jsonTr
  • 递归链接 Promise

    我正在开发一个简单的 Windows 8 应用程序 我需要在其中从网站获取一组数据 我正在使用 WinJS xhr 来检索此数据 它返回一个 Promise 然后 我将回调传递到此 Promise 的 then 方法中 该方法为我的回调提供
  • 如何将多个文件上传到Firebase?

    有没有办法将多个文件上传到 Firebase 存储 它可以在一次尝试内上传单个文件 如下所示 fileButton addEventListener change function e Get file var file e target
  • 如何使用 Selenium webdriver 测试对 SVG 对象的点击?

    我正在尝试编写代码来检查单击 SVG 对象的功能 例如此 URL 上的美国州 http www amcharts com svg maps map usa 这可行 但是有更好的方法吗 不需要物理移动鼠标的东西 robert new Robo
  • 如何在正则表达式中区分数字和ip地址?

    例如 如果我们查看 5 56 和 183 55 0 144 基本上 当你做这样的事情时 d d 它匹配 5 56 189 55 和 0 144 有没有办法通过正则表达式仅匹配数字而不匹配 ip 地址的部分 我尝试使用前瞻 但我不知道它应该是
  • Puppeteer 无法在 VPS (DigitalOcean) 上工作

    我在水滴中数字海洋 https www digitalocean com 我收到这个错误 node 5549 UnhandledPromiseRejectionWarning TimeoutError Navigation Timeout
  • 在express中root后通过可选参数传递路由控制?

    我正在开发一个简单的网址缩短应用程序 并有以下快速路线 app get function req res res render index link null app post function req res function makeR
  • Chrome:window.print() 打印对话框仅在页面重新加载后打开 (javascript)

    我面临着一个非常奇怪的问题 我正在从 javascript 文件调用 window print 这在 Safari IE Firefox 中运行良好 直到两小时前 它在 Chrome 中也运行良好 版本29 0 1547 57 我没有更改我
  • 节点项目的 Azure git 部署失败

    我正在尝试将我的项目部署到azure 它正在失败 这些是我采取的步骤 git init git config core longpaths true git add git commit m initial commit 所有这些都有效 我
  • 将命令行参数传递给 emscripten 生成的应用程序

    当使用 Emscripten 编译 C 程序时 会生成一个 HTML 页面来显示程序的结果 我想知道如何将命令行参数传递给应用程序 例如 对于原始的 C 程序 它是 bfs 32 1 我能够通过向生成的 html 文件添加一行来传递命令行参
  • 谷歌浏览器不显示一个网站的alert()弹出窗口

    我正在开发一个 javascript 循环 该循环会随着循环的进行而提醒每个键值 为了加快速度 我选中了 阻止此页面创建其他对话框 框 通常这只会抑制一个例程的弹出窗口 但它们还没有回来 在 Google Chrome 中 alert 消息
  • angularjs 将 ngModel 从包装器指令传递到包装器指令

    我是 Angular 的新手 但仍然痛苦地纠结于自定义指令 我想重用这段 HTML
  • 如何连接/组合两个数组以连接成一个数组?

    我正在尝试将 JavaScript 中的 2 个数组合并为一个 var lines new Array a b c lines new Array d e f 这是一个简单的例子 我希望能够将它们组合起来 这样当读取第二行时 数组中的第四个
  • 具有值的 TextInput 不会更改值

    在我的react native应用程序中 我有一个API 我从中检索数据 并且我在输入值中设置数据 用户应该能够编辑这些输入并更新 但是当我尝试输入输入时它不会输入任何内容并且值保持原样 这是 TextInput 代码
  • nodeJS exec 不适用于“cd”shell cmd

    var sys require sys exec require child process exec exec cd home ubuntu distro function err stdout stderr console log cd

随机推荐

  • 如何在Dart中正确下载图片并转换为base64?

    我很难下载图片然后将其显示在页面上 打印的 Base64 编码字符串看起来错误 它与例如不同http www freeformatter com base64 encoder html结果 这是我的代码 HttpRequest reques
  • 连接到 SQL Server 2008 R2 Express 时出错

    我已在 Windows 7 上安装了 SQL Server 2008 R2 Express 当我在 VS2010 中运行 Web 项目时 我收到以下错误 发生网络相关或特定于实例的错误 建立与 SQL Server 的连接 找不到服务器或
  • 创建 Android 签名证书 SHA-1 时如何解决此错误“在 c:\Users\kulde\.android\ 中找不到 debug.keystore”

    我正在尝试创建 google 登录应用程序 其中我需要 Android 签名证书 SHA 1 首先有一个 android 文件夹 其中包含另外两个文件 但那些不是 debug keystore 所以我在 stackoverflow 上读到了
  • javascript:如何将日期字符串 (YYYY-MM-DD) 增加 1 天

    我知道如何在 php 中使用 date 和 mktime 函数执行此操作 但不知道如何在 javascript 中完成相同的操作 function incr date date str magic here return next date
  • 如何从 OpenLayers.Control.DrawFeature 获取积分返回

  • Jquery CSS 和 JS 限制元素 [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我想将 Jquery 移动 CSS 和 JS 仅应用于某些有限的元素 而不应用于页面上的其他元素 知道我该怎么做吗 我有一些 Salesforce 标准客户门户 其中包含一个包含 Jq
  • 如何在 Perl 6 中向我的自定义类添加下标?

    我是 Perl 6 的新手 我的 Atom 编辑器中有以下代码 但我仍然不明白它是如何工作的 我复制了以下代码 作为docs raku org说了 不过好像不行 所以我将代码更改为 use v6 class HTTPHeader class
  • 无法返回 cellForRowAtIndexPath 中的单元格

    我试图在 tableView 中返回不同的单元格 通常在这种情况下 我会返回不同的单元格 然后在底部返回 nil 但在这种情况下 它会给我带来错误 我也尝试过返回一个空单元格 但也给了我错误 我尝试过的 return nil and var
  • 如何测试网络管道服务是否正在监听

    如何以编程方式测试以查看特定的网络管道服务是否正在运行和侦听 这样我就不会收到 没有端点正在侦听 异常 例如 如果我有这个代码 Uri baseAddress new Uri http localhost something var Ser
  • 在画布上绘图时的偏移

    有一个简单的绘图应用程序 问题出在坐标 redraw函数 它们必须是鼠标 但接近 2x 鼠标 代码中有什么问题
  • mysqli 使用 p: connect 选项打开多个新进程

    这是我第一次在这里提问 我搜索了 Google stackoverflow 等 寻求帮助解决我遇到的问题 我们目前使用 PHP 5 3 10 和 MySQL 5 0 95 以及 Apache 2 2 21 CentOS 我们正在开始从旧的
  • 云中的 Elastic Search 集群

    我有 2 个 Linux VM 均位于云提供商的同一数据中心 Elastic1 和 Elastic2 其中 Elastic 2 是 Elastic 1 的克隆 两者都有相同的 centos 版本 相同的集群名称和相同的 ES 版本 Elas
  • 在R中绘制椭圆/双曲线

    我想在R中画椭圆 双曲线 我该如何使用 ggplot2 来做到这一点 让我举个例子 x 2 3xy 4x 2y 2y 2 0 for x between 2 and 2 y between 2 and 2 构造数据字段 d lt trans
  • 提供者与Oracle客户端版本不兼容

    我正在尝试使用Oracle ODP NET 11g 11 1 0 6 20 即时客户端在我的 ASP net 项目中数据提供者但是当我运行 aspx 页面时 我得到一个 提供者与Oracle客户端版本不兼容 错误消息 任何帮助将不胜感激 我
  • 由于放弃的提交而导致 Git 合并挂起

    我有两个提交 提交 B 依赖于提交 A 提交 A 被放弃 现在我在合并 B 时遇到错误 它说已提交 由于 B 对 A 的依赖而合并待处理 我用谷歌搜索过但找不到确切的答案 我需要一步一步的解决方案 因为我是 git 的新手 并且很难理解如何
  • 将 Dagger 与 java 11 和 Maven 一起使用

    Google Dagger DIF 是否适用于 java 11 如果不是 鉴于不可能将项目更改为使用 java 8 那么替代方案是什么 是的 可以将 dagger 2 32 与 maven 和 java 11 一起使用 我遇到了编译过程和
  • SQL 格式时间对象从 24 小时到 12 点

    有没有办法在 SQL 中将时间对象转换为 12 小时格式 我不能使用日期时间 因为检索的数据不是特定于日期的 16 45 00 gt 下午 4 45 尝试使用这个 DECLARE aux NVARCHAR 8 16 45 00 SELECT
  • 可能的空引用返回c# linq

    我有这个 linq 查询 它抱怨警告消息 警告 CS8603 可能返回空引用 Code return await applicationDbContext Pies Include x gt x Portions AsSingleQuery
  • Secrets 模块如何在 Python 中生成完美的随机序列

    现在我对数学有了相当的了解 并且我知道可以使用特定的数学算法创建伪随机序列 我还知道在Python中有一个secrets显然可以产生随机数的模块 我尝试对其进行一些调整 但我仍然不明白它应该如何工作 我们来说一下这段代码 import se
  • 使用 lodash 重塑 JSON 并减少

    我想根据从 URL 下载的已解析 CSV 文件重塑 JSON 我使用 csvtojson 模块来解析 CSV 并创建需要重新整形的 JSON 下面是我的完整代码 const require lodash to handle datetime