разобрать строку в JSON в узле JS Express

1

Итак, у меня есть некоторые строковые данные, отображаемые в браузере с помощью jyth express jython python. Данные выглядят примерно так:

some_logs abcdata_start, ds0,06-01-2016,3,4,5,06-01-2015,8,9,10,05-01-2015,10,11,12, ds1,06-01-2016,32, 42,52,06-01-2015,8,9,10,05-01-2015,10,11,12, abcdata_end, some_logs, abcdata_start, ds0,06-01-2016,13,14,15,06 -01-2015,18,19,10,05-01-2015,10,11,12, ds1,06-01-2016,33,43,53,06-01-2015,8,9,10,05 -01-2015,10,11,12, abcdata_end

Я хочу преобразовать эти данные в json, чтобы:

"intervals": {
   "06-01-2016": {
     "ds0": {
       "0": [
         3, 4, 5
       ],
       "1": [
         13,14,15
       ]
     },
     "ds1": {
       "0": [
         32, 42, 52
       ],
       "1": [
         33, 43, 53
       ]        
     }
   },
   "06-01-2015": { 
     filling values in similar way as above
   }    
}
Теги:
string
express

2 ответа

0
Лучший ответ

Я потратил некоторое время на вопрос, и я не уверен, что мое решение является оптимальным, но оно работает:

var str = 'some_logs abcdata_start,ds0,06-01-2016,3,4,5,06-01-2015,8,9,10,05-01-2015,10,11,12,ds1,06-01-2016,3,4,5,06-01-2015,8,9,10,05-01-2015,10,11,12,abcdata_end,some_logs,abcdata_start,ds0,06-01-2016,13,14,15,06-01-2015,18,19,10,05-01-2015,10,11,12,ds1,06-01-2016,3,4,5,06-01-2015,8,9,10,05-01-2015,10,11,12,abcdata_end';
var indexes = [];
var ds = {};

str.split(',').forEach((el, i) => {
  if (el.includes("start") || el.includes("end"))
    indexes.push(i);
});

indexes = indexes.reduce((acc, el, i, arr) => {
  if (i % 2 == 0)
    acc.push([el, arr[i+1]]);
  return acc;
}, []);

indexes.forEach(arr => {
  var tmp = str.split(',').slice(arr[0] + 1, arr[1]);
  var tmpIndex = "";
  tmp.forEach(val => {
    if (val.length === 3 && val.includes("ds"))
      tmpIndex = val;
    else
      ds[tmpIndex]
        ? ds[tmpIndex].push(val)
        : ds[tmpIndex] = [val];
  });
});

Object.keys(ds).forEach(key => {
  var tmpIndex = "";
  ds[key] = ds[key].reduce((acc, val) => {
    if (val.match(/[0-9]{2}-[0-9]{2}-[0-9]{4}/) !== null)
      tmpIndex = val;
    else
      acc[tmpIndex]
        ? acc[tmpIndex].push(val)
        : acc[tmpIndex] = [val]
    return acc;
  }, {});


  Object.keys(ds[key]).forEach(dateKey => {
    ds[key][dateKey] = ds[key][dateKey].reduce((acc, val, i, arr) => {
      if (i % 3 == 0)
        acc.push([val, arr[i+1], arr[i+2]]);
      return acc;
    }, [])
  });
});

var res = {};
Object.keys(ds).forEach(dsNum => {
  Object.keys(ds[dsNum]).forEach(date => {
    if (res.hasOwnProperty(date)) {
      res[date][dsNum]
        ? res[date][dsNum].push(ds[dsNum][date])
        : res[date][dsNum] = [ds[dsNum][date]];
    } else {
      res[date] = {[dsNum]: [ds[dsNum][date]]}
    }
  })
})

Object.keys(res).forEach(date => {
  Object.keys(res[date]).forEach(ds => {
    res[date][ds] = res[date][ds][0];
  })
})

РЕДАКТИРОВАТЬ

Короткий вариант, то же самое, но с множеством уродливых вещей, трюков и вложенных тройных:

var str = 'some_logs abcdata_start,ds0,06-01-2016,3,4,5,06-01-2015,8,9,10,05-01-2015,10,11,12,ds1,06-01-2016,32,42,52,06-01-2015,8,9,10,05-01-2015,10,11,12,abcdata_end,some_logs,abcdata_start,ds0,06-01-2016,13,14,15,06-01-2015,18,19,10,05-01-2015,10,11,12,ds1,06-01-2016,33,43,53,06-01-2015,8,9,10,05-01-2015,10,11,12,abcdata_end', indexes = [], ds = {}, res = {};

str.split(',').forEach((el, i) => (el.includes("start") || el.includes("end")) ? indexes.push(i) : null);
indexes = indexes.reduce((acc, el, i, arr) => (i % 2 == 0) ? acc.concat([[el, arr[i+1]]]) : acc, []);
indexes.forEach((arr, tmpIndex = "") => str.split(',').slice(arr[0] + 1, arr[1]).forEach(val => (val.length === 3 && val.includes("ds")) ? tmpIndex = val : ds[tmpIndex] ? ds[tmpIndex].push(val) : ds[tmpIndex] = [val]));

Object.keys(ds).forEach((key, tmpIndex = "") => {
  ds[key] = ds[key].reduce((acc, val) => ((val.match(/[0-9]{2}-[0-9]{2}-[0-9]{4}/) !== null) ? tmpIndex = val : acc[tmpIndex] ? acc[tmpIndex].push(val) : acc[tmpIndex] = [val]) == undefined ? acc : acc, {});
  Object.keys(ds[key]).forEach(dateKey => ds[key][dateKey] = ds[key][dateKey].reduce((acc, val, i, arr) => (i % 3 == 0) ? acc.concat([[val, arr[i+1], arr[i+2]]]) : acc, []));
});   
Object.keys(ds).forEach(dsNum => Object.keys(ds[dsNum]).forEach(date => (res.hasOwnProperty(date)) ? res[date][dsNum] ? res[date][dsNum].push(ds[dsNum][date]) : res[date][dsNum] = [ds[dsNum][date]] : res[date] = {[dsNum]: [ds[dsNum][date]]}));
Object.keys(res).forEach(date => Object.keys(res[date]).forEach(ds => res[date][ds] = res[date][ds][0]));

Надеюсь, поможет,
С наилучшими пожеланиями,

  • 0
    Можете ли вы проверить редактирование один раз ... Я сделал строку в соответствии с моим желаемым JSON
  • 0
    Это все еще работает, я заменил str на ваш новый в части 'EDIT'
-1

Вы можете использовать JSON.parse() для преобразования json-строки в JSON

пример

var jsonstring = '{'key1':'value1','key2':'value2'}';
var JSondata = JSON.parse(jsonstring);
console.log(JSondata);

и теперь вы можете видеть, что ваш журнал будет в форме JSON

{
    'key1':'value1',
    'key2':'value2'
}

надеюсь, что эта помощь и

  • 1
    Downvote: рассматриваемый журнал не является строкой в формате JSON, поэтому вызов JSON.parse поможет.
  • 0
    И строковый литерал недействителен. И даже если бы это было так, это не будет действительным JSON.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню