예측할 수없는 중첩 의 여러 개체 / 배열을 가질 수있는 배열로 작업하고 있습니다. 각 객체는 항상 name
속성을 가지며 이러한 객체 중 일부는의 배열을 가질 수 있습니다 sub_fields
. 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"은 위의 "foo / bar"예제가 아니라 내가 작업중인보다 관련성 높은 JSON 데이터에서 가져온 것입니다.)
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)
위의 내용은 나를 매우 가깝게 만들었지 만 결국 객체의 첫 번째 sub_field 안에 중첩 된 sub_fields에 갇히게됩니다.
위의 내용이 웃을 수 있음을 알고 있습니다. 친절하세요! :-)
예, 재귀를 사용하면 매우 쉽습니다. 기본 사례는 다음과 같습니다.
null
합니다.그런 다음 기본 재귀 사례 :
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' }] } ] } ] } ]
function toObj(data) {
if (data == null) return null;
//collect all recursive calls to the function in the same object
if (Array.isArray(data))
return data.reduce((acc, data) => ({ ...acc, ...toObj(data)}), {})
//produce a new object from the `name` property and a recursive application of the function
return { [data.name]: toObj(data.sub_fields, {}) };
}
console.log(toObj(data))
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다