JavaScript解析JSON并从中创建键值数组
我有简单的json格式,如下所示:JavaScript解析JSON并从中创建键值数组,javascript,json,Javascript,Json,我有简单的json格式,如下所示: { "Template": [ { "ID": "856", "name": "users", "Template_Id": 0 }, { "ID": "857", "name": "avatars", "Template_Id": 1 },
{
"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;i document.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吗