Как преобразовать вложенное дерево JSON в CSV - PullRequest
0 голосов
/ 04 июля 2019

сейчас у меня есть вложенный объект дерева JSON (this.props.holdinginfo), отправляемый из бэкэнда во внешний интерфейс, и я пытаюсь добавить кнопку EXPORT на веб-странице, чтобы иметь возможность экспортировать объект JSON в csv файл с помощью реакции.

Объект дерева JSON выглядит следующим образом:

[{'holder': 'Passive', 'Position': 500.0, 'pct_shares_out': 0.5,
    'Node': [{'holder': 'TD Inc.', 'Position': 300.0, 'pct_shares_out': 0.2,
            'Node': [{'holder': 'TD ETF', 'Position': 400, 'pct_shares_out': 0.1}, 
                 {'holder': 'TD Fund', 'Position': 430.0, 'pct_shares_out': 0.2}]}, 
 {'holder': 'Active', 'Position': 725.0, 'pct_shares_out': 0.1, 
    'Node': [{'holder': '18 Asset', 'Position': 390, 'pct_shares_out': 0.5, 
            'Node': [{'holder': '18 Inc.', 'Position': 190, 'pct_shares_out': 0.2}, 
                 {'holder': 'Lysander-18 Equity Fund Series A', 'Position': 19, 'pct_shares_out': 0.05}]}]}];

И я хочу CSV-файл в следующем формате:

holder/position/pct_share_out
'Passive'/500.0/0.5
'TD Inc.'/300.0/0.2
'TD ETF'/400/0.1
'TD Fund'/430/0.2
'Active'/725/0.1
'18 Asset'/390/0.5
'18 Inc.'/190/0.2
'Lysander-18 Equity Fund Series A'/19/0.05 

Что я сейчас делаю, так это добавление кнопки в js-файл в компоненте:

<Button variant="contained" 
    size="small" 
    onClick={this.handleExport}>
    <SaveIcon label="Export" />
        Export
</Button>

, который вызывает handleExport для экспорта таблицы в файл csv:

handleExport = () => {
    let csv = Papa.unparse(this.props.holdinginfo);
    console.log(csv);
}

Но так как this.props.holdinginfo является вложенным древовидным объектом, вывод console.log будет "" [объект объекта], [объект объекта], [объект объекта], [объект объекта], [объект объекта], [объект Объект], [объект Объект] .... "

Вопрос у меня - 1- Как преобразовать вложенное дерево JSON в CSV? 2- Как скачать этот CSV, когда пользователь нажимает кнопку?

Спасибо за помощь !!

Ответы [ 4 ]

0 голосов
/ 04 июля 2019

Чтобы попасть в простой список, можно использовать рекурсивную функцию, подобную приведенной ниже:

const input = [{
  'holder': 'Passive',
  'Position': 500.0,
  'pct_shares_out': 0.5,
  'Node': [{
      'holder': 'TD Inc.',
      'Position': 300.0,
      'pct_shares_out': 0.2,
      'Node': [{
          'holder': 'TD ETF',
          'Position': 400,
          'pct_shares_out': 0.1
        },
        {
          'holder': 'TD Fund',
          'Position': 430.0,
          'pct_shares_out': 0.2
        }
      ]
    },
    {
      'holder': 'Active',
      'Position': 725.0,
      'pct_shares_out': 0.1,
      'Node': [{
        'holder': '18 Asset',
        'Position': 390,
        'pct_shares_out': 0.5,
        'Node': [{
            'holder': '18 Inc.',
            'Position': 190,
            'pct_shares_out': 0.2
          },
          {
            'holder': 'Lysander-18 Equity Fund Series A',
            'Position': 19,
            'pct_shares_out': 0.05
          }
        ]
      }]
    }
  ]
}];


var result = [];

function toCSV(items) {
  if (items) {
    items.forEach(function(a) {
      result.push({
        0: a.holder,
        1: a.Position + '/' + a.pct_shares_out
      });
      toCSV(a.Node);
    });
  }
}
  toCSV(input);
console.log(result)

Может изменяться в соответствии с требованиями и использоваться в papaparse.

0 голосов
/ 04 июля 2019

Вы не можете вызвать papa.unparse, потому что у вас нет плоского массива.Ваша структура данных является рекурсивной, поэтому вам потребуется рекурсивная функция для выравнивания, если перед отправкой ее в papa.unparse.

const j = [{'holder': 'Passive', 'Position': 500.0, 
'pct_shares_out': 0.5,                          
'Node': [{'holder': 'TD Inc.', 'Position': 300.0, 'pct_shares_out': 0.2,                                
'Node': [{'holder': 'TD ETF', 'Position': 400, 'pct_shares_out': 0.1},                               
{'holder': 'TD Fund', 'Position': 430.0, 'pct_shares_out': 0.2}]},
{'holder': 'Active', 'Position': 725.0, 'pct_shares_out': 0.1,                                     
'Node': [{'holder': '18 Asset', 'Position': 390, 'pct_shares_out': 0.5,                                 
'Node': [{'holder': '18 Inc.', 'Position': 190, 'pct_shares_out': 0.2},                              
{'holder': 'Lysander-18 Equity Fund Series A', 'Position': 19, 'pct_shares_out': 0.05}]}]}]}];

const papa = require('papaparse');                                                               
function flatten(array) {                           
        var result = [];                                
        array.forEach(function (a) {                        
        var node = a.Node;
        delete a.Node;
        result.push(a);
        if (node) {
            result = result.concat(flatten(node));
        }
    });
    return result;
}
const flat = flatten(j);
console.log(flat)
console.log(papa.unparse(flat));

0 голосов
/ 04 июля 2019
  1. получить файл json из бэкэнда.
  2. импортировать этот модуль передать ему json
  3. тогда как пользователь может загрузить ваш CSV .... проверьте здесь
0 голосов
/ 04 июля 2019

Сначала я бы преобразовал объект json в список, я бы создал рекурсивную функцию, которая анализирует элементы, каждый раз, когда он находит атрибут, он просто добавляет свое значение, но если он находит объект или массив, вызывает рекурсивныйфункция, которая должна возвращать список элементов для добавления в основной список, или вместо того, чтобы возвращать список, вы можете вернуть строку, строящую строку во время рекурсии.Другой вариант, который я хотел бы рассмотреть, - это создать рекурсивную функцию для преобразования многоуровневого объекта json в простой объект json, пропуская объект json через рекурсии, в каждую рекурсию добавляя атрибуты текущего уровня, а затем преобразовывая его в то, что мне нужно,Конечно, я попробовал бы это, только если бы я не нашел библиотеку или функцию, которая делает это автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...