Javascript 从现有对象创建新数组对象
我有一个json文件,它是从我使用的服务返回的。我无法控制服务,因此无法更改json文件的结构。该文件看起来像:Javascript 从现有对象创建新数组对象,javascript,jquery,Javascript,Jquery,我有一个json文件,它是从我使用的服务返回的。我无法控制服务,因此无法更改json文件的结构。该文件看起来像: menu":[ { "section":"theMobileMenu", "key":"menuItem1Title", "content":"Mobile context and principles" }, { "section":"theMobileMenu", "key":"menuItem1Link", "content":"/mobile
menu":[
{
"section":"theMobileMenu",
"key":"menuItem1Title",
"content":"Mobile context and principles"
},
{
"section":"theMobileMenu",
"key":"menuItem1Link",
"content":"/mobile/index.html"
},
{
"section":"theMobileMenu",
"key":"menuItem2Title",
"content":"Global guidelines"
},
{
"section":"theMobileMenu",
"key":"menuItem2Link",
"content":"/mobile/global-guidelines.html"
},
{
"section":"theMobileMenu",
"key":"menuItem3Title",
"content":"First impressions"
},
{
"section":"theMobileMenu",
"key":"menuItem3Link",
"content":"/mobile/first-impressions.html"
}
]
var newData = []
var curData = {};
var x = 1;
$.each(data.menu, function(i, val) {
if(val.key == 'menuItem'+x+'Link'){
curData.link = val.content;
}
if(val.key == 'menuItem'+x+'Title'){
curData.title = val.content;
}
newData.push(curData)
curData = []
x++;
})
我想创建一个对象数组,如下所示
"menu":[
{
"title":"Mobile context and principles",
"link":"/mobile/index.html"
},
{
"title":"Global guidelines",
"link":"/mobile/global-guidelines.html"
},
{
"title":"First impressions",
"link":"/mobile/first-impressions.html"
}
]
我试过这样的方法:
menu":[
{
"section":"theMobileMenu",
"key":"menuItem1Title",
"content":"Mobile context and principles"
},
{
"section":"theMobileMenu",
"key":"menuItem1Link",
"content":"/mobile/index.html"
},
{
"section":"theMobileMenu",
"key":"menuItem2Title",
"content":"Global guidelines"
},
{
"section":"theMobileMenu",
"key":"menuItem2Link",
"content":"/mobile/global-guidelines.html"
},
{
"section":"theMobileMenu",
"key":"menuItem3Title",
"content":"First impressions"
},
{
"section":"theMobileMenu",
"key":"menuItem3Link",
"content":"/mobile/first-impressions.html"
}
]
var newData = []
var curData = {};
var x = 1;
$.each(data.menu, function(i, val) {
if(val.key == 'menuItem'+x+'Link'){
curData.link = val.content;
}
if(val.key == 'menuItem'+x+'Title'){
curData.title = val.content;
}
newData.push(curData)
curData = []
x++;
})
这不太管用。关于如何解决这个问题有什么想法吗?尝试下面的代码使用
for
循环会更容易。。如果您的数据按上述顺序排列
var data = {
"menu":
[
{
"section":"theMobileMenu",
"key":"menuItem1Title",
"content":"Mobile context and principles"
},
{
"section":"theMobileMenu",
"key":"menuItem1Link",
"content":"/mobile/index.html"
},
{
"section":"theMobileMenu",
"key":"menuItem2Title",
"content":"Global guidelines"
},
{
"section":"theMobileMenu",
"key":"menuItem2Link",
"content":"/mobile/global-guidelines.html"
},
{
"section":"theMobileMenu",
"key":"menuItem3Title",
"content":"First impressions"
},
{
"section":"theMobileMenu",
"key":"menuItem3Link",
"content":"/mobile/first-impressions.html"
}
]
};
var newData = [];
var curData = {};
var menu = data.menu;
for(i=0, j=1; i < menu.length; i+=2, j++){
if(menu[i]['key'] == "menuItem"+j+"Title"){
curData.title = menu[i]['content'];
if($.isPlainObject(menu[i+1]) && menu[i+1]['key'] == "menuItem"+j+"Link"){
curData.link = menu[i+1]['content'];
}
newData.push(curData);
}
curData = {};
}
console.log(newData);
试试这个:
var data = [{
"section": "theMobileMenu",
"key": "menuItem1Title",
"content": "Mobile context and principles"
}, {
"section": "theMobileMenu",
"key": "menuItem1Link",
"content": "/mobile/index.html"
}, {
"section": "theMobileMenu",
"key": "menuItem2Title",
"content": "Global guidelines"
}, {
"section": "theMobileMenu",
"key": "menuItem2Link",
"content": "/mobile/global-guidelines.html"
}, {
"section": "theMobileMenu",
"key": "menuItem3Title",
"content": "First impressions"
}, {
"section": "theMobileMenu",
"key": "menuItem3Link",
"content": "/mobile/first-impressions.html"
}];
var obj = {};
var menu = data.map(function(v, k) {
if (v.key.match(/menuItem\d*Title/) !== null) {
obj = {
title: v.content
};
} else if (v.key.match(/menuItem\d*Link/) !== null) {
obj.link = v.content;
return obj;
}
});
menu = $.grep(menu, function(n) {
return n == 0 || n
});
该代码仅在键按OP中所示的确切顺序出现时才有效。此解决方案适用于具有临时对象和一些正则表达式的任何顺序,以匹配键、标题和链接
var object={menu:[{“section”:“移动菜单”,“key”:“menuItem1Title”,“content”:“移动上下文和原则”},{“section”:“移动菜单”,“key”:“menuItem1Link”,“content”:“/Mobile/index.html”},{“section”:“移动菜单”,“key”:“menuItem2Title”,“content”:“全局指南”},{“section”:“移动菜单”,“key”:“menuItem2Link”、“content”:“/mobile/global guidelines.html”},{“section”:“TheMobileMenus”、“key”:“menuItem3Title”、“content”:“First impressions”},{“section”:“TheMobileMenus”、“key”:“menuItem3Link”、“content”:“/mobile/First impressions.html”},
结果=函数(数组){
var temp={}
array.forEach(函数(a){
var k=a.key.match(/^menuItem\d*/);
temp[k]=temp[k]|{};
temp[k][a.key.match(/(Title)|(Link)$/)[0].toLowerCase()]=a.content;
});
返回Object.keys(temp.map)(函数(k){returntemp[k];});
}(对象菜单);
document.write(“”+JSON.stringify(result,0,4)+“”);
请检查
data
应该是data.menu
。我已经编辑到data.menu。虽然它进入循环,但没有什么区别吗?你能检查一下吗?@mr_j..它在cod以下工作吗?你的答案返回一个空白数组。Will的答案有效!介意快速解释一下你是怎么做的吗?@mr_j,数据是一个数组,所以你可以o data.map(函数(v){…});请注意,我不需要原始数据中的k.v每个对象。因此,我们测试键if title,然后初始化obj变量并设置title。if link,然后设置obj变量的链接(此时,它已经设置了title)。然后返回obj。此返回语句返回数组中的对象。当您运行data.map时,返回的是一个长度相等的数组。如果您不返回任何内容,则返回未定义的对象。由于未定义,我们使用$.grep筛选未定义的对象。很好…想知道$.grep的用途。谢谢,我已经学会了一些循环技巧数组和对象此返回一个空白数组请在下面查找Fiddle URL您得到解决方案了吗?