Javascript 如何从奇怪的Json转换为更简单的对象或数组
我有一个json,如下所示:Javascript 如何从奇怪的Json转换为更简单的对象或数组,javascript,json,object,Javascript,Json,Object,我有一个json,如下所示: var data = [ { "For Home Products": [ "Menu Free Antivirus", "Menu Premium", "Menu Internet Security" ] }, { "For Business Products": [ {
var data = [
{
"For Home Products": [
"Menu Free Antivirus",
"Menu Premium",
"Menu Internet Security"
]
},
{
"For Business Products": [
{
"Client/Servers": [
"Menu Professional Security",
"Menu Server Security",
"Menu Business Security Suite",
"Menu Endpoint Security"
]
},
{
"Integration": [
"Anti-Malware",
"Antispam SDK (SPACE)",
"Rebranding & Bundling",
"Integration Services"
]
},
"Small Business",
"Managed Services",
{
"Gateways": [
"Menu MailGate",
"Menu MailGate Suite",
"Menu AntiVir Exchange",
"Menu WebGate",
"Menu WebGate Suite",
"Menu GateWay Bundle",
"Menu SharePoint"
]
}
]
}
]
我的问题是,如何将其转换为更易于工作的对象?例如,我想用另一个名为“newData”的对象。我花了两天的时间来处理这些数据,但我就是做不到,而且我在努力简化过程中遗漏了一些东西。我希望你们理解我的意思,我知道我不是一个好的解释者。为此提前感谢您
我的输出应该是:
稍后编辑:这个问题与我问的第一个问题不同,因为我已经确定了我在那里遇到的问题,即JSON的结构和输出的不同结构。我现在的问题是,如何将其转换为更简单的对象或数组来处理。您可以使用函数
reduce
将其转换为更简单的对象来处理数据
这种方法返回一个键值
对象
var data=[{“家用产品”:[“菜单免费防病毒”、“菜单高级”、“菜单互联网安全”]},{“商用产品”:[{“客户端/服务器”:[“菜单专业安全”、“菜单服务器安全”,“菜单业务安全套件”,“菜单端点安全”]},{“集成”:[“反恶意软件”,“反垃圾邮件SDK(空间)”,“品牌重塑与捆绑”,“集成服务”]},“小型企业”、“托管服务”、“网关”:[“菜单邮件门”、“菜单邮件门套件”、“菜单抗病毒药物交换”、“菜单网络门”、“菜单网络门套件”,“菜单网关包”,“菜单SharePoint”]}]}],
[forPro,forBus]=数据;
var forProKey=Object.keys(forPro.pop();
var forbusKey=Object.keys(forBus.pop();
//函数“reduce”仅用于将来进一步扩展属性。
var newObject=data.reduce((a,c)=>{
如果(c[forProKey])a[forProKey]=c[forProKey];
否则a[forbusKey]=c[forbusKey];
返回a;
},{[forProKey]:[],[forbusKey]:[]});
console.log(newObject)代码>
.as控制台包装{最大高度:100%!重要;顶部:0;}
分析
将数据
转换为写为
{"main menu": data}
显示要设置的菜单对象的输入结构:
{"menu label": menuItemsArray}
在哪里
- 菜单对象的标签是其单独属性的名称。标签可用于根据需要为文件夹/书籍/集合/扩展器添加标签
- 菜单对象的label属性的值是菜单项的数组
- 菜单项可以是string类型的叶节点,也可以是类型和结构与菜单对象相同的非叶节点。简而言之,是一个子菜单节点
设计
更有用的数据结构可以使用两种对象:
菜单或子菜单对象:
{ isMenu: true, // a menu or submenu item
label: menuLabelText,
items: arrayOfMenuItems
}
叶节点对象(仅限文本)
编码
这是一个概念代码,用于生成数据的中间形式:
函数转换数据(menuData){
如果(!menuData | | typeof menuData!=“对象”){
抛出新的TypeError(“无效的convertData参数”);
}
var keys=Object.keys(menuData);
如果(key.length!=1){
抛出新类型错误(“无效菜单或子菜单对象”);
}
变量标签=键[0];
var itemData=menuData[label];
var节点={ismen:true,label:label,items:[]};
itemData.forEach(函数(项){
如果(项目类型==“字符串”){
push({isMenu:false,值:item});
}
else if(项目&(项目类型==“对象”)){
node.items.push(convertData(item));
}
否则{
抛出新类型错误(“无效菜单项:应为字符串或对象”)
}
});
返回节点;
}
//___________________________________________________
//和测试
风险值数据=[
{
“家用产品”:[
“菜单免费杀毒”,
“菜单高级”,
“菜单Internet安全”
]
},
{
“用于商业产品”:[
{
“客户端/服务器”:[
“菜单专业安全”,
“菜单服务器安全”,
“菜单业务安全套件”,
“菜单端点安全性”
]
},
{
“一体化”:[
“反恶意软件”,
“反垃圾邮件SDK(空间)”,
“品牌重塑和捆绑销售”,
“集成服务”
]
},
“小企业”,
“托管服务”,
{
“网关”:[
“菜单邮件门”,
“菜单邮件门套件”,
“菜单抗病毒交换”,
“菜单网门”,
“菜单WebGate套件”,
“菜单网关包”,
“菜单SharePoint”
]
}
]
}
]
var newData=convertData({main:data});
log(newData)
这已经是一个JS对象了。你到底想要实现什么?从JSON获取JS对象?@Orlandster如果注意到输出,它与JSON的构造方式不同。我想创建一个新对象,该对象的输出方式应该是无需更改JSON或硬编码的。希望我这次更明确一点,数组总是长度为2吗?@Ele是的,JSON的结构不会改变,为什么要重复
{ isMenu: false, // a leaf node
value: text
}