2015-12-19 4 views
1

У меня есть json-файл, который возвращается из службы am using. Я не контролирую службу, поэтому не могу изменить структуру json-файла. Файл выглядит примерно так:Создать новый объект массива из существующего объекта

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" 
} 
] 

Я хочу создать массив объектов, как один ниже

"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" 
} 
] 

Я пытался что-то вроде:

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++;    
}) 

Это не работают очень хорошо. Любые идеи о том, как это сделать?

+0

Пожалуйста, проверьте 'data' должен быть' data.menu'. –

+0

Я отредактировал файл data.menu. Не имеет значения, хотя –

+0

Это идет в цикл? вы можете это проверить? –

ответ

0

Try ниже код, используя 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); 

Выход:

[ 
    { 
    "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" 
    } 
] 
+0

Это возвращает пустой массив –

+0

Ниже вы найдете ссылку Fiddle URL –

+0

https://jsfiddle.net/Lzoe3mo9/ –

1

Попробуйте это:

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.

+0

Это работает! Разум дает краткое объяснение того, как вы это сделали? –

+0

@mr_j, data - массив, поэтому вы можете делать data.map (function (v) {....}); Просто заметьте, мне не нужен k. v каждый объект в исходных данных. Поэтому мы тестируем ключ, если заголовок, затем инициализируем переменную obj и устанавливаем заголовок. Если ссылка, то установите ссылку переменной obj (в этот момент она уже имеет набор названий). Затем верните obj. Операторы return возвращают объект в массиве. Когда вы запускаете data.map, return представляет собой массив равной длины. Если вы ничего не вернете, вы получите неопределенное. Из-за неопределенности мы используем $ .grep для отфильтровывания undefined. – Will

+0

Ницца ... Интересно, для чего нужен $ .grep. Спасибо, выучили несколько трюков по циклам массивов и объектов –

0

Это решение работает для любого заказа с временным объектом и некоторыми регулярными выражениями для соответствия ключа, названия и ссылки.

var object = { 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" }] }, 
 
    result = function (array) { 
 
     var temp = {} 
 
     array.forEach(function (a) { 
 
      var k = a.key.match(/^menuItem\d*/); 
 
      temp[k] = temp[k] || {}; 
 
      temp[k][a.key.match(/(Title)|(Link)$/)[0].toLowerCase()] = a.content; 
 
     }); 
 
     return Object.keys(temp).map(function (k) { return temp[k]; }); 
 
    }(object.menu); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

0

https://jsfiddle.net/VixedS/01x2a8jp/

var oldData = {menu:[{ "section": "theMobileMenus", "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 = [] 
$.each(oldData.menu, function(i, val){ 
    if (this.key.indexOf('Link') > -1) 
     newData.push({'title':this.section,'link':this.content}); 
}); 

newData=JSON.stringify(newData); 
Смежные вопросы