将JSON字符串转换为JS数组
如何将文件夹结构JSON字符串转换为JS Array。我关注了JSON字符串
[{ "Name": "A", "ParentName": "Config", "Type": "default" },
{ "Name": "SubA", "ParentName": "A", "Type": "default" },
{ "Name": "SubAFile", "ParentName": "SubA", "Type": "file" },
{ "Name": "B", "ParentName": "Config", "Type": "default" },
{ "Name": "C", "ParentName": "Config", "Type": "default" }]
我想用以下格式将JS Array对象生成
var NewStr = [{
"name": 'A',
"id": 'A',
"icon": 'fa fa-folder',
"items": [{
"title": "A",
"icon": "fa fa-folder",
"id": "A",
"items": [{
"name": "subA",
"icon": "fa fa-folder",
"id": "subA",
"items": [{
"title": "SubA",
"icon": "fa fa-folder",
"id": "SubA",
"items": [{
"name": "SubAFile",
"icon": "fa fa-file"
}]
}]
}]
}]
}, {
"name": 'B',
"id": 'b',
"icon": "fa fa-folder"
}, {
"name": 'C',
"id": 'C',
"icon": "fa fa-folder"
}];
注意:我加入ParentName是为了标识文件夹结构的层次结构。ID将与名称相同。
对此有什么建议吗?
谢谢..
解决方案
您可以使用Map
按名称键入节点,并在使用reduce
迭代输入时构建树。如果父节点尚不存在,请为每个节点创建一个父节点。发生这种情况时,请记住这个新创建的父级是树的根:它的子级是您要生成的数组。
以下是ES6代码:
// Sample input JSON parsed:
const items = JSON.parse('[{"Name":"A","ParentName":"Config","Type":"default"},{"Name":"new","ParentName":"A","Type":"file"},{"Name":"B","ParentName":"Config","Type":"default"},{"Name":"C","ParentName":"Config","Type":"default"}]');
const arr = items.reduce( ([nodes, root], {Name, ParentName, Type}) => {
const node = Object.assign({ // create node
name: Name,
icon: Type == 'default' ? 'fa fa-folder' : 'fa fa-file'
}, nodes.get(Name)); // add previously registered children, if any
const parent = nodes.get(ParentName) || (root = {}); // create parent if not present
parent.items = (parent.items || []).concat(node); // add current as child
return [nodes.set(Name, node).set(ParentName, parent), root];
}, [new Map, {}] )[1].items; // start with empty map, return the items of the root
// Output result
console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }
更新问题后更新
在您的问题的更新中,所需的输出已更改,具有更多嵌套级别:具有子节点的节点现在需要一个中间对象作为子节点(具有基本相同的属性),而子节点又将子节点附加到其自己的items
属性。
以下是为此目的而改编的ES6代码:
function buildTree(folders) {
const [nodes, root] = folders.reduce( ([nodes, root], {Name, ParentName, Type}) => {
const node = Object.assign({ // create node
name: Name,
id: Name,
icon: Type == 'default' ? 'fa fa-folder' : 'fa fa-file'
}, nodes.get(Name)); // add previously registered children, if any
const parent = nodes.get(ParentName) || (root = {}); // create parent if not present
parent.items = (parent.items || []).concat(node); // add current as child
return [nodes.set(Name, node).set(ParentName, parent), root];
}, [new Map, {}] );
// To add the extra intermediate levels (requested in updated question):
nodes.forEach( node => {
if (node.items) node.items = [{
title: node.name,
icon: node.icon,
id: node.id,
items: node.items
}]
});
return root.items[0].items;
}
// Sample JSON data, parsed
const folders = JSON.parse('[{ "Name": "A", "ParentName": "Config", "Type": "default" },{ "Name": "SubA", "ParentName": "A", "Type": "default" },{ "Name": "SubAFile", "ParentName": "SubA", "Type": "file" },{ "Name": "B", "ParentName": "Config", "Type": "default" },{ "Name": "C", "ParentName": "Config", "Type": "default" }]');
const arr = buildTree(folders);
// Output result
console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }
ES5版本
对于ES6支持较少的浏览器(如IE):
function buildTree(folders) {
var result = folders.reduce(function (acc, obj) {
var nodes = acc[0];
var root = acc[1];
var node = { // create node
name: obj.Name,
id: obj.Name,
icon: obj.Type == 'default' ? 'fa fa-folder' : 'fa fa-file'
};
// add previously registered children, if any
if (nodes[obj.Name]) node.items = nodes[obj.Name].items;
var parent = nodes[obj.ParentName] || (root = {}); // create parent if not present
parent.items = (parent.items || []).concat(node); // add current as child
nodes[obj.Name] = node;
nodes[obj.ParentName] = parent;
return [nodes, root];
}, [{}, {}] );
// To add the extra intermediate levels (requested in updated question):
for (var name in result[0]) {
var node = result[0][name];
if (node.items) node.items = [{
title: node.name,
icon: node.icon,
id: node.id,
items: node.items
}];
}
return result[1].items[0].items;
}
// Sample JSON data, parsed
var folders = JSON.parse('[{ "Name": "A", "ParentName": "Config", "Type": "default" },{ "Name": "SubA", "ParentName": "A", "Type": "default" },{ "Name": "SubAFile", "ParentName": "SubA", "Type": "file" },{ "Name": "B", "ParentName": "Config", "Type": "default" },{ "Name": "C", "ParentName": "Config", "Type": "default" }]');
var arr = buildTree(folders);
// Output result
console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }
相关文章