2 回答
TA贡献1807条经验 获得超9个赞
您可以使用递归函数而不是一级map()函数。
首先,使用 过滤掉值field_id === null以获取根元素。
然后通过过滤获得它的孩子fields.filter(field => field.field_id === item.id)并将函数应用于每个孩子。
let fields = [
{ id: 1, field_id: null, key: 'key1', value: 'value1'},
{ id: 2, field_id: 1, key: 'key2', value: 'value2'},
{ id: 3, field_id: 2, key: 'key3', value: 'value3'},
{ id: 4, field_id: 1, key: 'key4', value: 'value4'}
];
const getNested = (item) => {
const children = fields.filter(field => field.field_id === item.id);
return {
[item.key] : children.length === 0 ? item.value : children.map(field => getNested(field))
}
}
const nestedJSON = fields.filter(field => field.field_id === null).map(field => getNested(field))
console.log(nestedJSON);
TA贡献1806条经验 获得超8个赞
您可以采用单循环方法并生成一棵树。
该解决方案采用节点到父节点和父节点到节点之间的两个方向。
let fields = [{ id: 1, field_id: null, key: 'key1', value: null }, { id: 2, field_id: 1, key: 'key2', value: null }, { id: 3, field_id: 2, key: 'key3', value: 'value3' }, { id: 4, field_id: 1, key: 'key4', value: 'value4' }],
tree = function (data, root) {
var t = { keys: {} };
data.forEach(({ id, field_id, key, value }) => {
t[id] = t[id] || {};
t[id][key] = value === null ? [] : value;
t.keys[id] = key;
t[field_id] = t[field_id] || {};
let k = t.keys[field_id];
t[field_id][k] = t[field_id][k] || [];
t[field_id][k].push(t[id]);
});
return t[root].undefined;
}(fields, null);
console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }
添加回答
举报