Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从奇怪的Json转换为更简单的对象或数组_Javascript_Json_Object - Fatal编程技术网

Javascript 如何从奇怪的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": [ {

我有一个json,如下所示:

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
    }