1

I need convert this object:

{
    "en": "[\"En1\",\"En2\"]",
    "de": "[\"De1\",\"De2\"]"
}

to:


[
    {
        "en": "En1",
        "de": "De1"
    },
    {
        "en": "En2",
        "de": "De2"
    }
]

Can you help me?

i tried as follows:

const obj = {
  en: '["En1","En2"]',
  de: '["De1","De2"]',
};

const result = Object.entries(obj).map(([key, value]) => ({
  [key]: JSON.parse(value),
}));

console.log(result)

but this only returns me an array of objects and I don't know how to go ahead and create a new array with key-value matches.

4 Answers 4

1

const data = {
    "en": "[\"En1\",\"En2\"]",
    "de": "[\"De1\",\"De2\"]"
}

console.log(Object.values(Object.entries(data).reduce((a,[k,v])=>
  (JSON.parse(v).forEach((e,i)=>(a[i]??={})[k]=e),a),{})))

Sign up to request clarification or add additional context in comments.

Comments

0

You can separate your object into 2 arrays then combine them like this

const obj = {
  en: '["En1","En2"]',
  de: '["De1","De2"]',
};

// Convert to array, separate them by key
let en = JSON.parse(obj.en.split(',')); 
let de = JSON.parse(obj.de.split(','));

//then combine both arrays 
const result = en.map((x,i) =>({
  en:x,
  de:de[i]
}))

console.log(result);

Comments

0

You can use a combination of Array#map and Array#reduce as follows. The number of items is not hard-corded, so this will work for any number of items:

const 
      input = { "en": "[\"En1\",\"En2\"]", "de": "[\"De1\",\"De2\"]"},
      
      output = Object.entries(input)
        .map(([key,vals]) => JSON.parse(vals).map(v => ({[key]:v})))
        //..producing [[{"en":"En1"},{"en":"En2"}],.....]
        .reduce(
           (obj, values) => 
           obj.length === 0 ? 
             values.map(v => v) :                     //initial result: [{"en":"En1"},{"en":"En2"}]
             values.map((v,i) => ({...obj[i],...v})), //appends "de" prop to each element, ....
           []
        ); 
        
console.log( output );

1 Comment

Cool; feel free to upvote and/or accept as answer if you found this helpful.
0

I've opted for a more imperative approach here. It appends objects to the returnArray array for each index of the parsed values array. If value matches idx + 1 (eg 'De1'.includes(1)), a key-value pair is initialized on the object at the current index of the returnArray array.

My answer relies on a lot of assumptions regarding the input. If the parsed string array elements are not in numerical order, or there are gaps in the values, eg De3, De1, De2, or De1, De6, the current solution doesn't account for it.

let returnArray = [];

Object.entries(obj).forEach(pair => {
  let key = pair[0];
  let values = JSON.parse(pair[1]);

  values.forEach((_el, idx) => {
    if (!returnArray[idx]) {
      returnArray.push({});
    }

    let value = values[idx];
    if (value.includes(idx + 1)) {
      returnArray[idx][key] = values[idx];
    }
  });
});

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.