Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/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 - Fatal编程技术网

JavaScript解析JSON并从中创建键值数组

JavaScript解析JSON并从中创建键值数组,javascript,json,Javascript,Json,我有简单的json格式,如下所示: { "Template": [ { "ID": "856", "name": "users", "Template_Id": 0 }, { "ID": "857", "name": "avatars", "Template_Id": 1 },

我有简单的json格式,如下所示:

{
    "Template": [
        {
            "ID": "856",
            "name": "users",
            "Template_Id": 0
        },
        {
            "ID": "857",
            "name": "avatars",
            "Template_Id": 1
        },
        {
            "ID": "858",
            "name": "emails",
            "Template_Id": 2
        }
    ]
}
现在我正在尝试解析它并创建键值数组,例如:

var sArray = {856:users, 857:avatars, 858:emails};
对于在解析json后创建此数组,我的代码不正确,出现以下错误:

Message: TypeError: obj.Template.name is undefined
我的代码是:

    var obj = JSON.parse(jsonText);
    var count_templates = obj.Template.length;
    var template_array;

    /* Length is not static */
    for( i=0; i < count_templates; i++){
        id = obj.Template.ID;
        template_array[id] =  obj.Template.name;
    }
    for(var key in template_array)
    {
        console.log("key " + key + " has value " + template_array[key]);
    }
var obj=JSON.parse(jsonText);
var count_templates=obj.Template.length;
变量模板数组;
/*长度不是静态的*/
对于(i=0;i
将此更改为

   for( i=0; i < count_templates; i++){
      id = obj.Template.ID;//Here you are not actually accessing the array index element
      template_array[id] =  obj.Template.name;//Here you are not actually accessing the array index element
   }

   for( i=0; i < count_templates; i++){
      id = obj.Template[i].ID;
      template_array[id] =  obj.Template[i].name;
   }
for(i=0;i
试试这个

var data = {
    "Template": [
        {
            "ID": "856",
            "name": "users",
            "Template_Id": 0
        },
        {
            "ID": "857",
            "name": "avatars",
            "Template_Id": 1
        },
        {
            "ID": "858",
            "name": "emails",
            "Template_Id": 2
        }
    ]
};


var temp = data.Template;
var res = {};
for (var i = 0; i < temp.length; i++) {
    res[temp[i]['ID']]  =  temp[i]['name'];
}

console.log(res);
var数据={
“模板”:[
{
“ID”:“856”,
“名称”:“用户”,
“模板Id”:0
},
{
“ID”:“857”,
“名称”:“化身”,
“模板Id”:1
},
{
“ID”:“858”,
“姓名”:“电子邮件”,
“模板Id”:2
}
]
};
var temp=数据模板;
var res={};
对于(变量i=0;i
我将在
模板
数组上使用一个简单的操作

var obj={
“模板”:[
{
“ID”:“856”,
“名称”:“用户”,
“模板Id”:0
},
{
“ID”:“857”,
“名称”:“化身”,
“模板Id”:1
},
{
“ID”:“858”,
“姓名”:“电子邮件”,
“模板Id”:2
}
]
};
var sArray=obj.Template.reduce(函数(o,tpl){
o[tpl.ID]=tpl.name;
返回o;
}, {});
document.getElementById('out').innerHTML=JSON.stringify(sArray)
类似这样的内容:

var data = {
    "Template": [
        {
            "ID": "856",
            "name": "users",
            "Template_Id": 0
        },
        {
            "ID": "857",
            "name": "avatars",
            "Template_Id": 1
        },
        {
            "ID": "858",
            "name": "emails",
            "Template_Id": 2
        }
    ]
};

var output = [];

data.Template.forEach(function(item){
    output.push(item.ID + ":" + item.name); 
});
虽然您可能想检查对象是否具有您首先要查找的属性,但您已经了解了

编辑:刚刚注意到您需要数组类型的输出。(即使数组周围有{}。在这种情况下,我将使用
map

data.Template.map(function(item){
    output.push(item.ID + ":" + item.name); 
});

感谢@torazaburo让我诚实,让我重新阅读了这个问题。

您可以使用reduce函数

var arr = {
   "Template": [
    {
        "ID": "856",
        "name": "users",
        "Template_Id": 0
    },
    {
        "ID": "857",
        "name": "avatars",
        "Template_Id": 1
    },
    {
        "ID": "858",
        "name": "emails",
        "Template_Id": 2
    }
]
};
 var data = arr["Template"].reduce(function (output , val){ 
   output[val.ID] = val.name;
   return output;
}, {});

 console.log(data)
var arr = {};
data.Template.map(function(item,i){ 
   if(!!item.name && !!item.ID) //check if properties are valid
             arr[item.ID] = item.name;
});

这很简单。首先,根据你的帖子中提到的示例输出,sArray不是数组,它是一个对象

步骤:

  • 首先,将实际的JSON文本转换为JSON对象
  • 从解析的JSON对象获取
    模板
    数组
  • 迭代
    模板
    数组,并按预期创建一个新的JSON对象
  • 示例代码:
    var jsonText='{Template:[{“ID”:“1”,“name”:“a”},{“ID”:“2”,“name”:“b”}]};
    var obj=JSON.parse(jsonText);
    var arr=obj[“模板”];
    var sArray={};
    对于(变量i=0;idocument.write(JSON.stringify(sArray));
    首先更改模板数组的变量类型,即

    var template_array=[];
    
    然后使用obj.Template[i]而不是obj.Template进行迭代。下面是工作代码:

    var obj = JSON.parse(jsonText);
    var count_templates = obj.Template.length;
    var template_array=[];
    
    /* Length is not static */
    for( i=0; i < count_templates; i++){
        id = obj.Template[i].ID;
        template_array[id] =  obj.Template[i].name;
    }
    for(var key in template_array)
    {
        console.log("key " + key + " has value " + template_array[key]);
    }
    
    var obj=JSON.parse(jsonText);
    var count_templates=obj.Template.length;
    var模板_数组=[];
    /*长度不是静态的*/
    对于(i=0;i
    使用映射功能

    var arr = {
       "Template": [
        {
            "ID": "856",
            "name": "users",
            "Template_Id": 0
        },
        {
            "ID": "857",
            "name": "avatars",
            "Template_Id": 1
        },
        {
            "ID": "858",
            "name": "emails",
            "Template_Id": 2
        }
    ]
    };
     var data = arr["Template"].reduce(function (output , val){ 
       output[val.ID] = val.name;
       return output;
    }, {});
    
     console.log(data)
    
    var arr = {};
    data.Template.map(function(item,i){ 
       if(!!item.name && !!item.ID) //check if properties are valid
                 arr[item.ID] = item.name;
    });
    
    返回
    对象{856:“用户”,857:“化身”,858:“电子邮件”}


    另一种解决方案。一般情况是:

    var arr = Object.keys(obj).map(function(k) {
        var o = {};
        o[obj[k].ID] = obj[k].name;
        return o;
    });
    
    您可以根据需要修改此模式。此处,
    k
    是当前访问的密钥,
    obj
    是您的数据

    更新:现在使用ES6返回json对象:

    Object.assign({}, ...data.Template.map(elt => ({[elt.ID]: elt.name})));
    
    这将
    data.Template
    的元素映射到小对象中,每个对象都有一个键值对,其中键是元素ID(使用ES6),值是名称。然后它将所有这些对象作为参数(使用
    )馈送到,从而将它们合并在一起

    { '856': 'users', '857': 'avatars', '858': 'emails' }
    
    使用下划线 另一方面,如果您愿意使用下划线,那么

    _.object(_.pluck(obj.Template, 'ID'), _.pluck(obj.Template, 'name'))
    

    这将输出
    {857:“化身”,858:“电子邮件”,ID:“856”,名称:“用户”,模板ID:0}
    ,因为您省略了initialValue参数。我喜欢您的文章带有
    数据。模板。forEach()
    。谢谢。没问题。很高兴我能帮上忙。请注意这个ES5方法的支持:你为什么不使用
    map
    ?无论如何,这将输出一个字符串,这几乎肯定不是你想要的。你能说清楚你想要什么输出吗?var sArray={856:users,857:avatars,858:email}?或者[“856:users”,“857:avatars”,“858:emails”]?返回一个字符串数组,而他似乎想要一个对象。看起来很有趣,你能分享我可以阅读ES6 lambda表达式的url吗