如何通过reduce使对象值动态化?

时间:2019-05-13 18:21:23

标签: javascript

我正在尝试重组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动态化?

2 个答案:

答案 0 :(得分:1)

您可以destructure的每个对象获取_attributes.Idrest的对象以分隔变量。遍历对象,并创建一个与值相同的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 Kauwgom­balbeker 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 Kauwgom­balbeker 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)