-1

I am having this object:

product: {
    id: "id1",
    title: "ProductName 1",
    additionalDetails: {
        o1: {
            id: "pp1", 
            label: "Text",
            content: [{ id: "ppp1", label: "Tetetet" }]
        },
        o2: {
            id: "pp2", 
            label: "Text2", 
            content: [{ id: "ppp2", label: "Tetetet2" }]
        } 
    }
}

I try to iterate to each object.additionalDetails.object but I cannot. My code:

Object.keys(product.additionalDetails).forEach((key: string) => {
  const additionalDetail = product[key];
  const idLabel: string = additionalDetail.id;
  const label: string = additionalDetail.label;
  const contentId: string = additionalDetail.content[0].id;
  const content = additionalDetail.content[1].label;
});

But it does not work. What am I missing?

segFault
  • 3,887
  • 1
  • 19
  • 31
Kathrine Hanson
  • 575
  • 2
  • 10
  • 32

3 Answers3

2

Two errors :

Replace product[key] with product.additionalDetails[key]

and

additionalDetail.content[1] doesn't exist (content is an array with only one element inside)

product= {
  id: "id1",
  title: "ProductName 1",
  additionalDetails: {
    o1: {
      id: "pp1",
      label: "Text",
      content: [{
        id: "ppp1",
        label: "Tetetet"
      }]
    },
    o2: {
      id: "pp2",
      label: "Text2",
      content: [{
        id: "ppp2",
        label: "Tetetet2"
      }]
    }
  }
}

Object.keys(product.additionalDetails).forEach( key => {
  const additionalDetail = product.additionalDetails[key]; // <-- Here
  const idLabel = additionalDetail.id;
  const label= additionalDetail.label;
  const contentId = additionalDetail.content[0].id;
  // const content = additionalDetail.content[1].label;  // <-- content[1] Doesn't exist
});
Jeremy Thille
  • 26,047
  • 12
  • 43
  • 63
  • I should write: const contentId = additionalDetail.content[0].id; AND const content = (additionalDetail.content) ? additionalDetail.content[0].label : undefined; RIGHT? – Kathrine Hanson Feb 07 '20 at 16:28
  • Yes, or `const content = additionalDetail.content[1] && additionalDetail.content[1].label`, which ill check for the presence of `additionalDetail.content[1]` and if it exists, take the `.label` – Jeremy Thille Feb 08 '20 at 04:52
1

Iterate through the properties of additionalDetails by using any of Object.keys, Object.values, or Object.entries.

const product = {
  id: "id1",
  title: "ProductName 1",
  additionalDetails: {
    o1: {
      id: "pp1",
      label: "Text",
      content: [{
        id: "ppp1",
        label: "Tetetet"
      }]
    },
    o2: {
      id: "pp2",
      label: "Text2",
      content: [{
        id: "ppp2",
        label: "Tetetet2"
      }]
    }
  }
}

for (const [k, v] of Object.entries(product.additionalDetails)) {
  console.log(`Detail ${k} has label ${v.label}`);
}
zero298
  • 25,467
  • 10
  • 75
  • 100
0

You are trying to get the id index of an array

o1: {id: "pp1", label: "Text", content: [{id: "ppp1", label: "Tetetet"}]},

const contentId: string = additionalDetail.content.id;

You need to select an index of the array to get to the object containg the content id:

const contentId: string = additionalDetail.content[0].id;

You should also initialize additionalDetails with const.

Sondre Sørbye
  • 529
  • 1
  • 7
  • 15