Я пытаюсь уменьшить JSON объект вложенных объектов, массивов и строк в единый массив путей и значений.
Ожидаемый ввод:
appleObjects = {
'apples': {
'colors': ['red', 'green', 'yellow'],
'owner': 'Person1',
'types': [
{name: 'fuji', flavor: 'good'}
]
},
'pears': {
'colors': ['red', 'green', 'yellow'],
'owner': 'Person1',
'types': [
{name: 'small', flavor: 'surprising'},
{name: 'large', flavor: 'bold'}
]
}
}
Ожидаемый результат:
appleValues = [
{path: 'apples.colors', value: 'red'},
{path: 'apples.colors', value: 'green'},
{path: 'apples.colors', value: 'yellow'},
{path: 'apples.owner', value: 'Person1'},
{path: 'apples.types', value: {name: 'fuji', flavor: 'sweet?'}}
...
]
Пока я работаю над использованием вложенных функций Reduce и / или рекурсии, но, как и в веб-приложении, мне интересно, есть ли более эффективный способ или даже библиотека там уже что-то подобное.
Вот то, с чем я работаю до сих пор. В настоящее время «Реакция» жалуется на слишком много рекурсии, поэтому ясно, что это не самый лучший способ для go выполнить это:
myReducer = (p, obj) => {
Object.entries(obj ?? []).reduce((acc, currVal, currIdx) => {
if(typeof currVal === undefined) {
return acc
}
if(typeof currVal === "string") {
return {
basePath: acc.basePath,
outputArr: acc.outputArr.push({
path: acc.basePath + '.' + currVal[0],
value: currVal[1]
})
}
}
if(typeof currVal === "object") {
return {
basePath: acc.basePath,
outputArr: acc.outputArr.concat(this.myReducer(acc.basePath + '.' + currVal[0], currVal[1]))
}
}
return acc
}, {basePath: p, outputArr: []})
}
getArrayOfApplesValues = () => {
const {
applesObjects
} = this.state
if (applesObjects === null) return []
Object.entries(applesObjects).reduce((acc, currVal, currIdx) => {
if(typeof currVal[1] === "object") {
return {
path: acc.basePath,
outputArr: acc.outputArr.concat(this.myReducer (acc.basePath + '.' + currVal[0], currVal[1]))
}
}
return acc
}, {basePath: '', outputArr: []})
}
Простите, что в примерах мне не хватает знаний о яблоках.