Я работаю с массивом, который может иметь количество объектов / массивов непредсказуемое вложение. Каждый из объектов всегда будет иметь свойство name
, а некоторые из этих объектов могут иметь массив sub_fields
. Я sh выделю объект так, чтобы ключ каждого объекта равнялся свойству name
, сохраняя при этом уровни вложенности от оригинала.
Вот пример того, с чего я мог бы начать:
var data = [
{
foo: 'foo',
bar: 'bar',
name: 'Object 1'
},
{
foo: 'foo',
bar: 'bar',
name: 'Object 2'
},
{
foo: 'foo',
bar: 'bar',
name: 'Object 3',
sub_fields : [
{
foo: 'foo',
bar: 'bar',
name: 'SubLevel Object 1',
sub_fields: [
{
foo: 'foo',
bar: 'bar',
name: 'SubLevel Object 1',
}
]
},
{
foo: 'foo',
bar: 'bar',
name: 'SubLevel Object 2',
sub_fields: [
{
foo: 'foo',
bar: 'bar',
name: 'SubLevel Object 1',
},
{
foo: 'foo',
bar: 'bar',
name: 'SubLevel Object 2',
},
{
foo: 'foo',
bar: 'bar',
name: 'SubLevel Object 3',
sub_fields: [
{
foo: 'foo',
bar: 'bar',
name: 'SubLevel Object 1'
}
]
}
]
}
]
}
]
В идеале я собираюсь взять эти исходные данные и создать что-то вроде этого:
var newData = {
'Object 1': null,
'Object 2': null,
'Object 3': {
'Sublevel Object 1': {
'Sublevel Object 1': null
},
'Sublevel Object 2': {
'Sublevel Object 1': null,
'Sublevel Object 2': null,
'Sublevel Object 3': {
'Sublevel Object 1': null
}
}
}
}
Мне кажется, что я трачу слишком много времени на это, когда знаю, что должна быть какая-то рекурсивная функция, чтобы это произошло - я просто слишком неопытен с тем, что я Я изо всех сил пытаюсь найти решение.
Может кто-нибудь показать мне, что я могу сделать?
РЕДАКТИРОВАТЬ Вот что я пробовал. Это беспорядочный беспорядок и слишком частичный - смущающий на самом деле, ха-ха - но, по доброй воле, я не хотел, чтобы вы думали, что я не пытался понять это самостоятельно:
(также, анализируемая "field_group" взята из более релевантных JSON данных, с которыми я работаю ... а не из приведенного выше примера "foo / bar".)
var parsed_field_group = JSON.parse(JSON.stringify(field_group));
var fields = field_group[0].fields;
function removeKeys(obj, keys) {
for (var prop in obj) {
if(obj.hasOwnProperty(prop)) {
switch(typeof(obj[prop])) {
case 'object':
if(keys.indexOf(prop) > -1) {
delete obj[prop];
} else {
removeKeys(obj[prop], keys);
}
break;
default:
if(!keys.includes(prop)) {
delete obj[prop];
}
break;
}
}
}
}
removeKeys(fields, ['name', 'wrapper'])
console.log(fields)
var newJson = Object.create(null);
fields.forEach(field => {
if (field.hasOwnProperty('sub_fields')) {
newJson[field.name] = field
} else {
newJson[field.name] = null
}
})
function handleSubFields(obj, key) {
for (var prop in obj) {
if (obj[prop]) {
obj[prop][key].forEach(field => {
if (field.hasOwnProperty(key)) {
obj[prop][field.name] = field
} else {
obj[prop][field.name] = null
}
})
delete obj[prop][key]
delete obj[prop].name
}
}
}
handleSubFields(newJson, 'sub_fields')
console.log(newJson)
Приведенное выше очень приблизило меня, но я застрял в подполях, вложенных в первое подполе объекта.
Я знаю, что вышеперечисленное должно быть смешным. Пожалуйста, будьте добры! :-)