我正在尝试重组XML api的输出
当前,我正在对对象值进行硬编码,以使其与api返回的值匹配
if (!error && response.statusCode == 200) {
const data = convert.xml2json(body, { compact: true, spaces: 4 });
const json = JSON.parse(data);
const output = json.Products.Product;
const products = output.reduce((acum: any, element: any) => {
const obj: any = {};
obj.EAN = element.EAN._text;
obj.Title = element.Title._text;
acum[element._attributes.Id] = obj;
return acum;
}, {});
console.log(products);
}
如果api发生变化,这将是一个问题,如何使obj.values动态化?
答案 0 :(得分:1)
您可以destructure的每个对象获取_attributes.Id
和rest
的对象以分隔变量。遍历对象,并创建一个与值相同的key
但_text
的新对象。
const input=[{_attributes:{Id:"2205"},EAN:{_text:"7081019328418"},Title:{_text:" MaCo Choco's mini mix"},Brand:{_text:"MaCoFood"},Shortdescription:{_text:"Een heerlijke traktatie! Romige ijssticks gecoat in 4 soorten "},Fulldescription:{_text:"Belgische chocolade: puur, donkere melkchocolade, melkchocolade met amandelnoten en witte chocolade. Dikke laag Belgische melkchocolade Met natuurlijk Bourbon vanille-extract 12 stuks, om uit te delen! "},Image:{_text:"https://www.mupload.nl/img/wf8s4hxr4lor.jpg"},Weight:{_text:"12 stuks"},Price:{_text:"2.65"},Category:{_text:"Diepvries"},Subcategory:{_text:"IJs"},Subsubcategory:{_text:"IJsjes"}},{_attributes:{Id:"2206"},EAN:{_text:"7081011195254"},Title:{_text:"MaCo Kauwgombalbeker ijs"},Brand:{_text:"MaCoFood"},Shortdescription:{_text:"Vanilleijsjes met aardbeiensaus en een kauwgombal"},Fulldescription:{_text:"Vanilleroomijs met aardbeiensaus Met een kauwgombal onderin "},Image:{_text:"https://www.mupload.nl/img/pr9fi79s4.jpg"},Weight:{_text:"6 stuks"},Price:{_text:"1.69"},Category:{_text:"Diepvries"},Subcategory:{_text:"IJs"},Subsubcategory:{_text:"IJsjes"}}];
const output = input.reduce((acc, { _attributes: { Id }, ...rest }) => {
const obj = {};
for(const key in rest)
obj[key] = rest[key]._text
acc[Id] = obj;
return acc;
}, {})
console.log(output)
答案 1 :(得分:1)
您只需使用reduce
和forEach
首先从id
键中取出_attributes
并将其用作最终对象上的key
,然后使用forEach
在该键上添加其余值(由id)创建为键/值对
let data = [{ _attributes: { Id: '2205' },EAN: { _text: '7081019328418' },Title: { _text: ' MaCo Choco\'s mini mix' },Brand: { _text: 'MaCoFood' },Shortdescription:{ _text:'Een heerlijke traktatie! Romige ijssticks gecoat in 4 soorten ' },Fulldescription:{ _text:'Belgische chocolade: puur, donkere melkchocolade, melkchocolade met amandelnoten en witte chocolade. Dikke laag Belgische melkchocolade Met natuurlijk Bourbon vanille-extract 12 stuks, om uit te delen! ' },Image: { _text: 'https://www.mupload.nl/img/wf8s4hxr4lor.jpg' },Weight: { _text: '12 stuks' },Price: { _text: '2.65' },Category: { _text: 'Diepvries' },Subcategory: { _text: 'IJs' },Subsubcategory: { _text: 'IJsjes' } },{ _attributes: { Id: '2206' },EAN: { _text: '7081011195254' },Title: { _text: 'MaCo Kauwgombalbeker ijs' },Brand: { _text: 'MaCoFood' },Shortdescription:{ _text: 'Vanilleijsjes met aardbeiensaus en een kauwgombal' },Fulldescription:{ _text:'Vanilleroomijs met aardbeiensaus Met een kauwgombal onderin ' },Image: { _text: 'https://www.mupload.nl/img/pr9fi79s4.jpg' },Weight: { _text: '6 stuks' },Price: { _text: '1.69' },Category: { _text: 'Diepvries' },Subcategory: { _text: 'IJs' },Subsubcategory: { _text: 'IJsjes' } },]
let final = data.reduce((op,inp)=>{
let {'_attributes' : {Id}} = inp
let temp = {}
Object.keys(inp).forEach(key=>{
if( key !== '_attributes' ){
temp[key] = inp[key]['_text']
}
})
op[Id] = temp
return op
},{})
console.log(final)