【问题标题】:Getting CSV values from Javascript object从 Javascript 对象获取 CSV 值
【发布时间】:2012-07-08 05:24:17
【问题描述】:

我正在尝试将 Javascript 对象转换为 CSV 并将其存储到文件中。 我有一个演示:http://jsbin.com/atewix/8/edit

我想要做的是如果我在函数findProps() 中给实体值“时间”或“新闻”,

它应该以以下格式返回 CSV:

"http://www.testingmyurl.com", Time, Dec 9, 2012

"http://www.testingmyurl.com",News, Germany,Election
"http://www.testingmyurl.com",News,Egypt, Revolution

使用当前格式,它只返回单个值,并且也返回 [object,object]

{
"_index": "test",
"_source": {
     "link": "http://www.testingmyurl.com",
  "Categories": {
      "Types": {
          "Events": [{
              "count": 1,
              "entity": "Time",
              "Time": [{
                  "entity": "Dec 9",
                  "Dec_9": [{
                      "count": 1,
                      "entity": "2012"
                  }]
                  }]
              }]}}}}

这可以变成扁平结构吗?

【问题讨论】:

  • 您的嵌套对象似乎无法清晰地表示为 CSV。
  • 对结构变化的任何建议
  • 否 - 如果您有非平面结构,则无法将其表示为二维数组(csv 本质上是)。你需要知道你想如何在 excel 中展示你的结构——我不知道。
  • @Bergi Ive 编辑了问题部分..

标签: javascript arrays json recursion hash


【解决方案1】:

这是一个非常深的结构,但此函数将按原样处理您的数据。 fixSpace() 函数解释了 Dec 9Dec_9 之间的差异。

演示: http://jsfiddle.net/ThinkingStiff/r2kje/

输出:

News:
"http://www.testingmyurl.com","News","Germany","Election"
"http://www.testingmyurl.com","News","Egypt","Revolution"
Time:
"http://www.testingmyurl.com","Time","Dec 9","2012"

脚本:

function findProps( name, data ) {
    var results = [],
        events = data._source.Categories.Types.Events,
        link = data._source.link;

    for( var eventIndex = 0; eventIndex < events.length; eventIndex++ ) {
        var event = events[eventIndex];
        if( event.entity == name && event[name]  ) {
            for( var entityIndex = 0; entityIndex < event[name].length; entityIndex++ ) {
                var entity = event[name][entityIndex],
                    entityName = fixSpace( entity.entity );
                if( entity[entityName] ) {
                    for( var valueIndex = 0; valueIndex < entity[entityName].length; valueIndex++ ) {
                        var value = entity[entityName][valueIndex];
                        results.push( 
                              '"' + link + '",'
                            + '"' + name + '",'
                            + '"' + entity.entity + '",' //un-fixSpaced name
                            + '"' + value.entity + '"'
                        );
                    };
                };
            };
        };
    };

    return results;
};

function fixSpace( value ) {
    return value.replace( ' ', '_' );        
};

var news = findProps( "News", data );
document.getElementById( 'news' ).innerHTML = news.join( '<br />' );
var times = findProps( "Time", data );
document.getElementById( 'time' ).innerHTML = times.join( '<br />' );

HTML:

News:
<div id="news"></div>
Time:
<div id="time"></div>

【讨论】:

  • 如果Time或News数组的深度不固定怎么办,如果超过3级怎么办..
  • @user1371896 可以修改该函数以处理该问题。你甚至可以让它递归。最好是让你的数据结构更扁平。太深了。
  • 这种结构可以递归吗?你能告诉我怎么做吗?还是我应该再添加一个问题并将链接发布在 cmets 中?
  • @user1371896 实体和值这两个内部结构完全相同。如果更深层次的结构遵循相同的模式,您可以简单地添加更多级别的for()。使用您正在考虑的更深层次的结构以及您期望的结果来编辑您的问题,我可以为您指明正确的方向。
  • 我已经更新了 expctd 输出和 json...无论 Json 有多深,结果都应该在最后继续添加
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多