Итак, у меня есть некоторые строковые данные, отображаемые в браузере с помощью 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
}
}
Я потратил некоторое время на вопрос, и я не уверен, что мое решение является оптимальным, но оно работает:
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]));
Надеюсь, поможет,
С наилучшими пожеланиями,
Вы можете использовать JSON.parse() для преобразования json-строки в JSON
пример
var jsonstring = '{'key1':'value1','key2':'value2'}';
var JSondata = JSON.parse(jsonstring);
console.log(JSondata);
и теперь вы можете видеть, что ваш журнал будет в форме JSON
{
'key1':'value1',
'key2':'value2'
}
надеюсь, что эта помощь и
JSON.parse
поможет.
str
на ваш новый в части 'EDIT'