如何递归嵌套深层对象?

詹姆斯·巴拉卡

我正在使用一个可能具有许多不可预测的嵌套对象/数组的数组每个对象将始终具有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的问题。

我知道以上内容一定很可笑。请客气!:-)

VLAZ

是的,使用递归非常容易。这是您的基本情况:

  • 您收到的不是对象,而是返回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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章