如何检查是否需要解析或不需要解析?

时间:2017-11-20 13:24:24

标签: javascript arrays json parsing d3.js

我有一个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 但我希望有人能给我一个很好的答案。

对不起我的英语并对理论感到抱歉,感谢您的关注:)

2 个答案:

答案 0 :(得分:0)

如果您不介意添加信息,那么您只需输入train值并检查该值。使用上面的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。然后forEach检查它是否已被解析并跳过它,否则它将解析它。

答案 1 :(得分:0)

正如@Bwaxxlo所说:

  

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

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

  

返回的函数解析指定的字符串,返回相应的日期;如果根据此格式的说明符无法解析字符串,则返回null

所以它很清楚。我可以这样做:

Promise.all(allGlobalFilters.map(({rtbSspPublishers}) => rtbSspPublishers)).then(values => {
  const theNewValues = allGlobalFilters
                      .map((item, i) => { return  Object.assign({}, item, { rtbSspPublishers: values[i] }) })
                      .filter(item => item.rtbSspPublishers.name.startsWith('Mobile'))
    // use theNewValues right here, or call a methof
    // someMethod(theNewValues);
  })