javascript 如何将对象转换为对象数组

tquggr8v  于 2023-02-11  发布在  Java
关注(0)|答案(4)|浏览(183)

我需要转换此对象:

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

致:

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

你能帮帮我吗?
我尝试了以下方法:

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

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

console.log(result)

但这只返回了一个对象数组,我不知道如何创建一个新的键值匹配数组。

xienkqul

xienkqul1#

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),{})))
kokeuurv

kokeuurv2#

你可以把你的对象分成两个数组,然后像这样把它们组合起来

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);
eanckbw9

eanckbw93#

您可以使用Array#mapArray#reduce的组合,如下所示。项目数不是硬编码的,因此这将适用于任何数量的项目:

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 );
k97glaaz

k97glaaz4#

这里我选择了一种更强制的方法,它为解析后的values数组的每个索引向returnArray数组追加对象,如果valueidx + 1匹配(例如'De1'.includes(1)),则在returnArray数组的当前索引处的对象上初始化键值对。
我的答案依赖于很多关于输入的假设,如果解析的字符串数组元素不是按数字顺序排列的,或者在值eg De3, De1, De2De1, De6中有间隔,那么当前的解决方案不会考虑到这一点。

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];
    }
  });
});

相关问题