【问题标题】:how to check whether you need to parse or not need to parse?如何检查是否需要解析或不需要解析?
【发布时间】:2017-11-20 13:24:23
【问题描述】:

我有一个 JSON:

var datat= {"Model": "Model A",
                "Datase": [
                    {
                        "Id": "DatchikSveta11",
                        "Group": 2,
                        "State": "on",
                        "Data": [{
                            "Date":"2017-08-11 15:10:34.363",
                            "Value":"0" 
                        },{
                            "Date":"2017-08-12 21:12:34.363",
                            "Value":"32"
                        },{
                            "Date":"2017-08-15 21:55:34.363",
                            "Value":"200"
                            }],
                        "DataVolume": "luxs"    
                    },{
                        "Id": "DatchikSveta2",
                        "Group": 2,
                        "State": "on",
                        "Data": [{
                            "Date":"2017-08-11 17:11:34.363",
                            "Value":"100"
                        },{
                            "Date":"2017-08-15 18:11:34.363",
                            "Value":"100"
                        },{
                            "Date":"2017-08-16 19:12:34.363",
                            "Value":"200"
                        }],
                        "DataVolume": "luxs"
                    }
                ]}

我有一个解析 JSON 对象的函数。

parseDate = d3.timeParse("%Y-%m-%d %H:%M:%S.%L");
datat.Datase.forEach(function (kv) {
        kv.Data.forEach(function (d) {
            parseDate(d.Date);
            parseInt(d.Value);
        });
    });

此函数更改原始 JSON 对象中的值(解析日期的日期),因此当我第二次尝试调用此函数时,它会给出错误的值,因为它试图解析已经解析的日期。

我需要指定一个条件来检查您是否需要解析。 或者,也许有人有一个函数,可以在不改变原始 JSON 的情况下提取解析值?我知道最简单的方法是从函数返回新变量,例如:

 .data(function (d){
        var a = d.Data.slice(d.Data.length-1,d.Data.length);
        a.forEach(function (k){k["Id"]=d.Id;  k["Date"]=parseDate(d.Date);});
        return a;
    })  

我可以更改 JSON 中的日期格式,但谁需要简单的方法?

我是 javascript 新手,没有时间学习理论:P 但希望有人能给我一个好的答案。

对不起我的英语和理论,谢谢你的关注:)

【问题讨论】:

  • 我开始编辑你的问题,但在中间,我放弃了。这很不清楚。请花点时间进行编辑,澄清您的问题和期望的结果。
  • 同意,这个很不清楚。
  • 对不起,伙计们。我的英语太差了,所以很难准确地表达一个想法。
  • 请指定您的预期输出。
  • 立即查看。我想我会的

标签: javascript arrays json parsing d3.js


【解决方案1】:

如果您不介意添加信息,则可以输入 isParsed 值并检查该值。使用上面的 datat 变量,您可以简单地进行更改:

datat.Datase.forEach(function (kv) {
    kv.Data.forEach(function (d) {
        if(d.isParsed != true ){
            d.Date = parseDate(d.Date);
            d.Value = parseInt(d.Value);
            d.isParsed = true;
        }
    });
});

这将运行并进行您需要的更改,但设置一个 isParsed 的键并在您对其进行迭代时将其设置为 true。 forEach 使用 then 检查它是否已被解析,如果有则跳过它,否则将解析它。

【讨论】:

  • 感谢您的回答!它是一个很好的解决方案,但我想在不增加原始 json 大小的情况下达到结果。我想找到一个解决方案,让我可以将值与某个模板进行比较(例如“%Y-%m-%d %H:%M:%S.%L”)
【解决方案2】:

正如@Bwaxxlo 所说:

您可以检查变量是否是一个实例的日期对象。例如:x = new Date(); x instanceof Date //true。

正如 D3 API 所说的 d3.timeParse 函数:

返回函数解析一个指定的字符串,如果根据该格式的说明符无法解析该字符串,则返回对应的日期或null

所以它的工作原理很清楚。我可以这样做:

var jdates =[];
    var jvalues =[];
    datat.Datase.forEach(function (kv) {
        kv.Data.forEach(function (d) {
            if (!(d.Date instanceof Date)){
                jdates.push(d.Date = parseDate(d.Date));
                jvalues.push(d.Value = parseInt(d.Value));
            } else {
                jdates.push(d.Date);
                jvalues.push(d.Value);
            } 
        });
    });

【讨论】:

    猜你喜欢
    • 2019-06-13
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2021-06-30
    • 2012-12-12
    相关资源
    最近更新 更多