Mon*_*ica 4 ngx-datatable angular
在 ngx-data 表中如何循环遍历 ngx-data 表中的嵌套 Json 对象。
json 示例对象:
rows = [
{ name: 'Austin', gender: 'Male', company: 'Swimlane', topings:[
{ id:'101',name:'spinach'}]
},
{ name: 'Dany', gender: 'Male', company: 'KFC',topings:[
{ id:'102',name:'onion'}] },
{ name: 'Molly', gender: 'Female', company: 'Burger King' ,topings:[
{ id:'103',name:'ginger'}]},
Run Code Online (Sandbox Code Playgroud)
];
在 ngx-datatable 中,我需要如何循环遍历上面的 json 对象中的topings 并在数据表中显示toping 数据。任何人都可以回答我必须如何做到这一点......?
好吧,我的想法是,您需要对数据进行一些操作,然后才能将其呈现在数据表上。
首先,在您的 component.ts 上,您应该定义您的列。
tableColumns = [
{
prop: 'name',
name: 'Name'
},
{
prop: 'gender',
name: 'Gender'
},
{
prop: 'company',
name: 'Company'
},
{
prop: 'topingsId',
name: 'Topings ID'
},
{
prop: 'topingsName',
name: 'Topings Name'
}
]
Run Code Online (Sandbox Code Playgroud)
接下来,您应该尝试“展平”数据,使其成为单级对象的数组(而不是嵌套它们)。
this.rows = [
{
name: 'Austin', gender: 'Male', company: 'Swimlane', topings:[{ id:'101',name:'spinach'}]
},
{
name: 'Dany', gender: 'Male', company: 'KFC',topings:[{ id:'102',name:'onion'}]
},
{
name: 'Molly', gender: 'Female', company: 'Burger King' ,topings:[{ id:'103',name:'ginger'}]
}
];
this.rows = this.rows.map(row => ({
name: row['name'],
gender: row['gender'],
company: row['company'],
topingsId: row['topings'][0]['id'],
topingsName: row['topings'][0]['name']
}));
console.log(this.rows);
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的一点是,在你的 component.html 上,你可以这样渲染你的数据表:
<ngx-datatable class="material" [rows]="rows" [columns]="tableColumns"....></ngx-datatable>
Run Code Online (Sandbox Code Playgroud)
并且不要忘记定义表所需的其他属性。
使用一些 ES6 魔法来分配行数据的其他方法。
1) 使用扩展语法:
this.rows = this.rows.map(row => ({
...row,
topingsId: row['topings'][0]['id'],
topingsName: row['topings'][0]['name']
}));
Run Code Online (Sandbox Code Playgroud)
2)同时使用扩展语法和对象解构:
this.rows = this.rows.map(row => {
const {topings, ...others} = row;
return {
...others,
topingsId: row['topings'][0]['id'],
topingsName: row['topings'][0]['name']
};
});
Run Code Online (Sandbox Code Playgroud)
为了回答您关于评论的问题,我们的数据表行和列是动态的,我们必须采用稍微不同的策略。
首先,我们将您的数据展平为一组未嵌套的对象。我们获取每行的配料数组,然后将数组转换为对象。之后,我们使用展开语法将所有内容连接到一个对象中,该对象代表this.rows.
请注意,我们正在使用计算属性名称(另一个 ES6 功能)来提供每个顶部的动态属性键。
this.rows = this.rows.map(row => {
const {topings, ...others} = row;
const topingsList = topings.map((toping, index) => ({
['toping' + Number(index + 1) + ' Name']: toping['name']
}));
topingsObject = Object.assign({}, ...topingsList);
return {
...others,
...topingsObject
}
});
Run Code Online (Sandbox Code Playgroud)
接下来,从行数据中,我们必须收集新列的数组,这是 ngx-datatable 的必需属性之一。首先,我们的this.tableColumns定义是这样的:
tableColumns = [
{
prop: 'name',
name: 'Name'
},
{
prop: 'gender',
name: 'Gender'
},
{
prop: 'company',
name: 'Company'
}
];
Run Code Online (Sandbox Code Playgroud)
在获得 flattened 后this.rows,我们将获得行数据中可用属性的数组。从那里,我们tableColumns使用动态配料更新(例如 Toping1 名称、Toping2 名称等)
this.rows = this.rows.map(row => { .....}) // continued from the above
const headerNames = Object.keys(Object.assign({}, ...this.rows));
headerNames.map(header => {
if (header!=='name' && header!=='gender' && header!=='company') {
this.tableColumns.push({
prop: header,
name: header
});
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7225 次 |
| 最近记录: |