Home > Mobile >  change the position of object in array inside other object
change the position of object in array inside other object

Time:03-04

in given data every ingredient have its substitute option while I can select any substitute option for example if I want to change masala with its substitute output will change the position of substitute with it's option and output should be given below

i want to replace masala with normal masala

  • i have to create a function who replace ingredient with it's substitute and interchange the position of both *

input

const oData = [
    { CurryName: 'Chiken', id: 0 },
    {
      ingredients: [
        {
          id: 1,
          name: 'onion',
          property: { color: 'yellow', Quantity: 'half KG', price: 120 },
          subOption: [
            {
              id: 11,
              name: 'redOnion',
              property: { color: 'red', Quantity: '1 KG', price: 120 },
            },
            {
              id: 12,
              name: 'whiteOnion',
              property: { color: 'white', Quantity: '2 KG', price: 120 },
            },
          ],
        },
        {
          id: 2,
          name: 'oil',
          property: { color: 'green', Quantity: 'half LT', price: 120 },
          subOption: [
            {
              id: 21,
              name: 'yellowOil',
              property: { color: 'yellow', Quantity: '1 LT', price: 120 },
            },
            {
              id: 22,
              name: 'olivoOil',
              property: { color: 'golden', Quantity: '2 LT', price: 120 },
            },
            {
              id: 22,
              name: 'CastrolOil',
              property: { color: 'silk', Quantity: '2 LT', price: 170 },
            },
          ],
        },
        {
          id: 3,
          name: 'masala',
          property: { color: 'gray', Quantity: '1Tspoon', price: 30 },
          subOption: [
            {
              id: 31,
              name: 'garamMasala',
              property: { color: 'Garam', Quantity: '2Tspoon', price: 30 },
            },
            {
              id: 32,
              name: 'chikenMasala',
              property: { color: 'green', Quantity: ' 3Tspoon', price: 30 },
            },
            {
              id: 33,
              name: 'normalMasala',
              property: { color: 'red', Quantity: '5Tspoon', price: 30 },
            },
          ],
        },
      ],
    },
  ];
  
  // in given data every ingredient have it's substitute option while i can select any supstitute option for example if i  want to change masala with its substitute output will change the position of substitue with it's option and output should be given below
  //i want to replace masala with normal masala
  const output = [
    { CurryName: 'Chiken', id: 0 },
    {
      ingredients: [
        {
          id: 1,
          name: 'onion',
          property: { color: 'yellow', Quantity: 'half KG', price: 120 },
          subOption: [
            {
              id: 11,
              name: 'redOnion',
              property: { color: 'red', Quantity: '1 KG', price: 120 },
            },
            {
              id: 12,
              name: 'whiteOnion',
              property: { color: 'white', Quantity: '2 KG', price: 120 },
            },
          ],
        },
        {
          id: 2,
          name: 'oil',
          property: { color: 'green', Quantity: 'half LT', price: 120 },
          subOption: [
            {
              id: 21,
              name: 'yellowOil',
              property: { color: 'yellow', Quantity: '1 LT', price: 120 },
            },
            {
              id: 22,
              name: 'olivoOil',
              property: { color: 'golden', Quantity: '2 LT', price: 120 },
            },
            {
              id: 22,
              name: 'CastrolOil',
              property: { color: 'silk', Quantity: '2 LT', price: 170 },
            },
          ],
        },
        {
         
              id: 33,
              name: 'normalMasala',
              property: { color: 'red', Quantity: '5Tspoon', price: 30 },
           
         
          subOption: [
            {
              id: 31,
              name: 'garamMasala',
              property: { color: 'Garam', Quantity: '2Tspoon', price: 30 },
            },
            {
              id: 32,
              name: 'chikenMasala',
              property: { color: 'green', Quantity: ' 3Tspoon', price: 30 },
            },
            {
              id: 3,
              name: 'masala',
              property: { color: 'gray', Quantity: '1Tspoon', price: 30 },
             }
          ],
        },
      ],
    },
  ];
  
  console.log(output)

CodePudding user response:

I suggest that define an element before 'subOption' like 'selectedOption' so you can change it more easily between them

{
           selectedOption:{id: 33,
              name: 'normalMasala',
              property: { color: 'red', Quantity: '5Tspoon', price: 30 }},
         
          subOption: [
            {
              id: 31,
              name: 'garamMasala',
              property: { color: 'Garam', Quantity: '2Tspoon', price: 30 },
            },
            {
              id: 32,
              name: 'chikenMasala',
              property: { color: 'green', Quantity: ' 3Tspoon', price: 30 },
            },
            {
              id: 3,
              name: 'masala',
              property: { color: 'gray', Quantity: '1Tspoon', price: 30 },
             }
          ],
}

if you able to add 'selectedOption' you can use this code

let temp = oData[1].ingredients[3].subOption[3]
oData[1].ingredients[3].subOption[3].splice(3,1,oData[1].ingredients[3].selectedOption)
oData[1].ingredients[3].selectedOption=temp;

CodePudding user response:

I don't know about d3 library that you have included in the tags, but you can use something like this:

const oData = [{
    CurryName: 'Chiken',
    id: 0
  },
  {
    ingredients: [{
        id: 1,
        name: 'onion',
        property: {
          color: 'yellow',
          Quantity: 'half KG',
          price: 120
        },
        subOption: [{
            id: 11,
            name: 'redOnion',
            property: {
              color: 'red',
              Quantity: '1 KG',
              price: 120
            },
          },
          {
            id: 12,
            name: 'whiteOnion',
            property: {
              color: 'white',
              Quantity: '2 KG',
              price: 120
            },
          },
        ],
      },
      {
        id: 2,
        name: 'oil',
        property: {
          color: 'green',
          Quantity: 'half LT',
          price: 120
        },
        subOption: [{
            id: 21,
            name: 'yellowOil',
            property: {
              color: 'yellow',
              Quantity: '1 LT',
              price: 120
            },
          },
          {
            id: 22,
            name: 'olivoOil',
            property: {
              color: 'golden',
              Quantity: '2 LT',
              price: 120
            },
          },
          {
            id: 22,
            name: 'CastrolOil',
            property: {
              color: 'silk',
              Quantity: '2 LT',
              price: 170
            },
          },
        ],
      },
      {
        id: 3,
        name: 'masala',
        property: {
          color: 'gray',
          Quantity: '1Tspoon',
          price: 30
        },
        subOption: [{
            id: 31,
            name: 'garamMasala',
            property: {
              color: 'Garam',
              Quantity: '2Tspoon',
              price: 30
            },
          },
          {
            id: 32,
            name: 'chikenMasala',
            property: {
              color: 'green',
              Quantity: ' 3Tspoon',
              price: 30
            },
          },
          {
            id: 33,
            name: 'normalMasala',
            property: {
              color: 'red',
              Quantity: '5Tspoon',
              price: 30
            },
          },
        ],
      },
    ],
  },
];

const selectIngredients = (obj, mainName, subName) => {
  obj[1].ingredients.map(ingredient => {
    if (ingredient.name === mainName) {
      const optionIndex = ingredient.subOption.findIndex(element => element.name === subName);
      if (optionIndex) {
        const {
          id,
          name,
          property
        } = ingredient;
        ingredient.id = ingredient.subOption[optionIndex].id;
        ingredient.name = ingredient.subOption[optionIndex].name;
        ingredient.property = ingredient.subOption[optionIndex].property;
        ingredient.subOption[optionIndex].id = id;
        ingredient.subOption[optionIndex].name = name;
        ingredient.subOption[optionIndex].property = property;
      }
    }
  });
  return obj;
};

console.log(selectIngredients(oData, "masala", "normalMasala"));

CodePudding user response:

This solution may not be ideal because it changes the original data. But if you don't mind changing the original data, use this.

function swapIngredientMainSub(data, mainID, subID) {
  const { ingredients } = data[1];
  const targetIndex = ingredients.findIndex(({ id }) => id === mainID);
  const { subOption, ...main } = ingredients[targetIndex];
  const subIndex = subOption.findIndex(({ id }) => id === subID);
  const sub = subOption[subIndex];
  subOption[subIndex] = main;
  ingredients[targetIndex] = { ...sub, subOption };
}

swapIngredientMainSub(oData, 3, 33);

console.log(JSON.stringify(oData) === JSON.stringify(output)); // true

Option 2:

function swapIngredientMainSub(data, subID) {
  const { ingredients } = data[1];
  const targetIndex = ingredients.findIndex(({ subOption }) =>
    subOption.find(({ id }) => id === subID)
  );
  const { subOption, ...main } = ingredients[targetIndex];
  const subIndex = subOption.findIndex(({ id }) => id === subID);
  const sub = subOption[subIndex];
  subOption[subIndex] = main;
  ingredients[targetIndex] = { ...sub, subOption };
}

swapIngredientMainSub(oData, 33);

console.log(JSON.stringify(oData) === JSON.stringify(output)); // true
  • Related