【问题标题】:Create a new nested object from array of objects in JavaScript从 JavaScript 中的对象数组创建一个新的嵌套对象
【发布时间】:2021-06-07 18:01:15
【问题描述】:

我有如下嵌套的对象数组:

[       
          {
            "i18n Key": "messages.titles.info",
            English: "Info",
            Spanish: "Info",
          },
          {
            "i18n Key": "messages.titles.export",
            English: "Export",
            Spanish: "Exportar",
          },
          {
            "i18n Key": "messages.common.pleaseWait",
            English: "Please Wait…",
            Spanish: "Por favor esperar…",
          },
          {
            "i18n Key": "messages.common.errors.couldNotAccessADGroup",
            English: "Could not access AD to get user groups. Please try again.",
            Spanish: "No se puede acceder a AD para buscar grupos de usuarios. Por favor inténtelo nuevamente.",
          },
          {
            "i18n Key": "labels.country.regulatorList.regulatorForm.regulatorName",
            English: "Regulator Name",
            Spanish: "Nombre del regulador",
          },
          {
            "i18n Key": "labels.country.regulatorList.regulatorForm.country",
            English: "Country",
            Spanish: "País",
          },
]  

如何将其转换为这样的嵌套对象?

{
    "messages": {
      "titles": {
        "info": "Info",
        "export": "Exportar",
      },
      "common":{
        "pleaseWait":  "Por favor esperar…",
        "errors": {
            "couldNotAccessADGroup": "No se puede acceder a AD para buscar grupos de usuarios. Por favor inténtelo nuevamente.",
        }    
      },
    }  
    "labels":{
        "country":{
            "regulatorList":{
                "regulatorForm":{
                    "regulatorName":  "Nombre del regulador",
                    "country": "País",
                }
            }
        }
    }
}

“i18n Key”的长度不固定,可以是5,6,7等长度。

它基本上保持与“i18n Key”的最后一个单词相对应的西班牙值。

任何帮助将不胜感激。

【问题讨论】:

  • 您可以使用String.split('.') 将“i18n key”分隔为元素。

标签: javascript arrays json object nested-object


【解决方案1】:

由于i18n Key 值定义了输出的结构并且它可以改变它的长度,我建议使用递归来解决这个问题。

解决方案

// Input data
const descriptors = [
  {
    "i18n Key": "messages.titles.info",
    English: "Info",
    Spanish: "Info",
  },
  {
    "i18n Key": "messages.titles.export",
    English: "Export",
    Spanish: "Exportar",
  },
  {
    "i18n Key": "messages.common.pleaseWait",
    English: "Please Wait…",
    Spanish: "Por favor esperar…",
  },
  {
    "i18n Key": "messages.common.errors.couldNotAccessADGroup",
    English: "Could not access AD to get user groups. Please try again.",
    Spanish: "No se puede acceder a AD para buscar grupos de usuarios. Por favor inténtelo nuevamente.",
  },
  {
    "i18n Key": "labels.country.regulatorList.regulatorForm.regulatorName",
    English: "Regulator Name",
    Spanish: "Nombre del regulador",
  },
  {
    "i18n Key": "labels.country.regulatorList.regulatorForm.country",
    English: "Country",
    Spanish: "País",
  },
];

const sourceValue = 'Spanish';

const output = {};

const parseValue = (obj, value = undefined, keyMap = []) => {
  if (keyMap.length) {
    const propertie = keyMap.splice(0, 1);

    if (!Object.prototype.hasOwnProperty.call(obj, propertie)) {
      obj[propertie] = {};
    }

    if (!keyMap.length) {
      obj[propertie] = value;
    } else {
      obj[propertie] = parseValue(obj[propertie], value, keyMap);
    }
  }
  return obj;
};

for (let i = 0; i < descriptors.length; i++) {
  const descriptor = descriptors[i];
  const keyMap = descriptor['i18n Key'].split('.');
  
  parseValue(output, descriptor[sourceValue], keyMap);
}

console.log(JSON.stringify(output, null, 2));

【讨论】:

    猜你喜欢
    • 2020-12-21
    • 2019-09-23
    • 2022-01-07
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多