我正在使用一个可能具有许多不可预测的嵌套对象/数组的数组。每个对象将始终具有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”来自我正在使用的更相关的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)
上面的内容使我非常接近,但是最终我陷入了嵌套在对象的第一个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] 删除。
我来说两句