【问题标题】:Parsing JSON to exclude duplicates Node.JS解析 JSON 以排除重复的 Node.JS
【发布时间】:2016-01-27 14:10:10
【问题描述】:

首先,我是 NodeJS 和 JavaScript 的新手,因此我们将不胜感激。

我的目标是能够解析一个 csv 文件,这样我就可以看到每个月有多少用户登录。为了让我这样做,我使用 npm "CSVtoJSON" 将 csv 文件转换为 JSON 格式。这是我从 JSON 文件中得到的,但有超过 8000 多个条目。下面是一个sn-p。

[
 { date: '2015-04-09T19:30:22.213795+00:00',
   'email address': '',
   'full name': 'Canton Bashkin',
   action: 'LoggedInActivity',
   application: '',
   project: '',
   task: '',
   'other email address': '',
   'other full name': '',
   description: 'Canton Bashkin logged in' },
 { date: '2015-04-08T00:34:42.261728+00:00',
   'email address': '',
   'full name': 'Sha Phad',
   action: 'LoggedInActivity',
   application: '',
   project: '',
   task: '',
   'other email address': '',
   'other full name': '',
   description: 'Sha Phad logged in' },
 { date: '2015-04-07T23:31:32.559654+00:00',
   'email address': '',
   'full name': 'Canton Bashkin',
   action: 'LoggedInActivity',
   application: '',
   project: '',
   task: '',
   'other email address': '',
   'other full name': '',
   description: 'Canton Bashkin logged in' },
 { date: '2015-04-07T23:31:02.408628+00:00',
   'email address': '',
   'full name': 'Sha Phad',
   action: 'LoggedInActivity',
   application: '',
   project: '',
   task: '',
   'other email address': '',
   'other full name': '',
   description: 'Sneha Phadke logged in'}
]

我的代码:

//Converter Class 
var Converter = require("csvtojson").Converter;
var converter = new Converter({});
var allUsers = [];

//end_parsed will be emitted once parsing finished
function parseUsers() {

    converter.on("end_parsed", function (jsonArray) {
        for (var i = 0; i < jsonArray.length; i++) {
            var users = jsonArray[i]['full name'];
            if (jsonArray[i]['action'] === 'LoggedInActivity') {
                if (users != 'SD Elements Support' && users != 'Karan Sharala' && users != 'Rick Bogans'
                && users != 'Kanal Bhatya' && users != 'Sanka Saja' && users != 'Kiiko Plash') {
                        allUsers.push(jsonArray[i]);    
                } 
            }
        }

        console.log(allUsers);

    });
}

parseUsers();


//read from file 
require("fs").createReadStream("log.csv").pipe(converter);

我一直在试图找出解析 JSON 的最佳方法,这样我就不会将同名的重复项添加到数组中。如果我这样做完全错误,请指出我正确的方向。谢谢大家的帮助。

获得名称后,我需要将它们分成单独的月份,我不太确定如何做到这一点。任何帮助将不胜感激!

【问题讨论】:

  • 所以它们应该是唯一的 full name?
  • 如果 full nameString 您可以使用名称作为 Object 键 并测试对象是否存在关键的(比遍历一个数组测试每个项目要快得多)
  • 是的,没错
  • 请注意,@zero298 链接到的示例仅适用于原语,对于您需要比简单的 indexOf 更多努力的对象

标签: javascript json node.js csv


【解决方案1】:

使用名为unique对象 来跟踪已添加的字符串

var unique = Object.create(null); // empty object, no inheritance
for (var i = 0; i < jsonArray.length; i++) {
    var users = jsonArray[i]['full name'];
    if (jsonArray[i]['action'] === 'LoggedInActivity') {
        if (!(users in unique)) { // not seen this `full name` before
            unique[users] = allUsers.push(jsonArray[i]);
        } 
    }
}

如果你觉得它更容易理解,你可以将它与 filter 结合使用,在这个特定的例子中它不是很干净。一个非常大的 Array 也可能使 filter 的函数开销成本太高。

var unique = Object.create(null);
allUsers = jsonArray.filter(function (e) {
    if (e['action'] === 'LoggedInActivity' && !(e['full name'] in unique)) {
        return unique[e['full name']] = true;
    }
    return false;
});

【讨论】:

    猜你喜欢
    • 2017-09-03
    • 2015-06-28
    • 1970-01-01
    • 2017-04-06
    • 2018-05-17
    • 1970-01-01
    • 2012-04-10
    • 2016-02-24
    • 2017-01-09
    相关资源
    最近更新 更多