繁体   English   中英

如何从嵌套对象数组中保留特定对象属性

[英]How to keep specific object properties from an array of nested objects

我有一个对象数组,每个对象都有一个父对象,父对象有子对象。

我希望有一个数组,其中只包含父项的名称和ID以及其子项的名称和ID。 以下示例显示了一个对象当前的外观。

@id: "/course_categories/1"
@type: "CourseCategory"
children: Array(5)
   0: {@id: "/course_categories/2", @type: "CourseCategory", id: 2, name: "PHP voor beginners", left: 2, …}
   1: {@id: "/course_categories/3", @type: "CourseCategory", id: 3, name: "PHP advanced", left: 40, …}
   2: {@id: "/course_categories/4", @type: "CourseCategory", id: 4, name: "PHP voor dummies", left: 42, …}
   3: {@id: "/course_categories/5", @type: "CourseCategory", id: 5, name: "PHP voor experts", left: 44, …}
   4: {@id: "/course_categories/6", @type: "CourseCategory", id: 6, name: "PHP design patterns", left: 46, …}
id: 1
key: "0-1"
left: 1
level: 0
name: "PHP"
parent: null
right: 48

我希望如何:

data: [{
  title: 'PHP', id: 1, children: [
    {
      title: 'PHP voor beginners', id: 2, children: []
    },
    {
      title: 'PHP advanced', id: 3, children: []
    },
    {
      // PHP voor dummies, PHP voor experts, etc...
    }
  ]
},
{
  title: 'REACT', id: 4, children: [
    {
      title: 'React voor beginners', id: 5, children: [
        {
          title: 'React voor beginners 2', id: 6, children: []
        }
      ]
    },
    {
      // ....
    }
  ]
}]

孩子也有可能拥有孩子。 所以孩子的孩子应该有相同的格式。 (上面的例子)我知道这可以通过使用递归函数来实现,但我想知道过滤当前对象的最佳方法是什么。

您可以使用函数通过过滤键从对象中删除属性,然后使用reduce从剩余的键中获取对象。 您可以递归调用此函数以对子项执行相同操作。

然后,您可以编写一个单独的函数将name属性转换为title

 const data = [{ "@id": "/course_categories/1", "@type": "CourseCategory", children: [{ "@id": "/course_categories/2", "@type": "CourseCategory", id: 2, name: "PHP voor beginners", left: 2, }, { "@id": "/course_categories/3", "@type": "CourseCategory", id: 3, name: "PHP advanced", left: 40, }, { "@id": "/course_categories/4", "@type": "CourseCategory", id: 4, name: "PHP voor dummies", left: 42, }, { "@id": "/course_categories/5", "@type": "CourseCategory", id: 5, name: "PHP voor experts", left: 44, }, { "@id": "/course_categories/6", "@type": "CourseCategory", id: 6, name: "PHP design patterns", left: 46, } ], id: 1, key: "0-1", left: 1, level: 0, name: "PHP", parent: null, right: 48, }] const keepProperties = (object, properties) => { const objectWithOnlyRequiredProperties = Object.keys(object) .filter(key => properties.indexOf(key) > -1) .reduce((prev, curr) => ({ ...prev, [curr]: object[curr], }), {}); const children = object.hasOwnProperty('children') ? object.children.map(child => keepProperties(child, properties)) : []; return { ...objectWithOnlyRequiredProperties, children, }; } const transformNameToTitle = object => { const children = object.hasOwnProperty('children') ? { children: object.children.map(transformNameToTitle) } : false; const objectKeysWithoutName = Object .keys(object) .filter(key => key !== 'name') const objectWithoutName = keepProperties( object, objectKeysWithoutName, ); return { ...objectWithoutName, title: object.name, ...children, } } const test = transformNameToTitle( keepProperties(data[0], ['name', 'id']) ); console.dir(test) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM