繁体   English   中英

如何将 2 arrays 转换为具有键值对的 object

[英]How to turn 2 arrays into an object with key value pairs

我有一个 object,其中包含 2 个具有属性的对象:

const objects = {
  Battery: {
    batteryDetailsKey: ['serial_no', 'type', 'part_no'],
    batteryDetailsVal: [
      'HJ3CA19347410218LJ98 151 QC',
      'Extended Range',
      '4P94-Q051',
    ],
  },
  Modules: {
    moduleDetailsKey: ['serial_no', 'part_no', 'Cell Count'],
    moduleDetailsVal: [
      '8367532735006109322258160 50',
      'LJ98-10C779-A51',
      '32',
      '6',
    ],
  },
};

我需要将数据结构更改为:

const desiredObject = {
  Battery: {
    'serial_no': 'HJ3CA19347410218LJ98 151 QC',
    'type': 'Extended Range',
    'part_no': '4P94-Q051',
  },
  Modules: {
    'serial_no':'8367532735006109322258160 50',
    'part_no':'LJ98-10C779-A51',
    'cell_count': '32',
  },
};

我努力了

let emptyObject = {}

Object.keys(objects).forEach((q, i) => {
    emptyObject = {
        objects[q] 
    }
})

但还没有完全实现我想要的,欢迎任何帮助。 谢谢

编辑:

我刚刚意识到,对于 moduleDetailsVal,有时值是 arrays 的数组,如下所示:

const objectsWithMultipleArrays = {
  Battery: {
    batteryDetailsKey: ['serial_no', 'type', 'part_no'],
    batteryDetailsVal: [
      'HJ3CA19347410218LJ98 151 QC',
      'Extended Range',
      '4P94-Q051',
    ],
  },
  Modules: {
    moduleDetailsKey: ['serial_no', 'part_no', 'Cell Count'],
    moduleDetailsVal: [
    [
        "8367532735006109322258162 53",
        "LJ98-10C779-A54",
        "28",
    ],
    [
        "8367532735006109322258163 54",
        "LJ98-10C779-A55",
        "27",
    ],
    [
        "8367532735006109322258163 56",
        "LJ98-10C779-A56",
        "27"
    ]
],
  },
};

现在希望 object 拥有这样的对象数组

const newDesiredObject = {
  Battery: {
    serial_no: "HJ3CA19347410218LJ98 151 QC",
    type: "Extended Range",
    part_no: "4P94-Q051"
  },
  "Modules": [
    {
      "serial_no": "8367532735006109322258160 50",
      "part_no": "LJ98-10C779-A51",
      "cell_count": "32"
    },
     {
      "serial_no": "8367532735006109322258160 51",
      "part_no": "LJ98-10C779-A52",
      "cell_count": "33"
    },
     {
      "serial_no": "8367532735006109322258160 52",
      "part_no": "LJ98-10C779-A53",
      "cell_count": "33"
    },

  ]
}

请告知我如何处理这种情况

我假设:

  • 两个 arrays 的长度总是相等的。 或者
  • 键的数组(数组 1)更大,您需要数组 1 中的所有键,所有多余的键都将具有值undefined 或者
  • 键的数组(数组 1)较小,您希望跳过值数组(数组 2)中存在的所有额外值。

您可以尝试下面的代码,我在数组 1 上使用了Array reduce()并使用index参数访问数组 2 中的相应值。为了循环objects object,我使用Object.keys()并创建了一个新的所需的 object .

因此,您的问题的完整答案如下所示:

 const objects = { Battery: { batteryDetailsKey: ["serial_no", "type", "part_no"], batteryDetailsVal: ["HJ3CA19347410218LJ98 151 QC", "Extended Range", "4P94-Q051"], }, Modules: { moduleDetailsKey: ["serial_no", "part_no", "Cell Count"], moduleDetailsVal: ["8367532735006109322258160 50", "LJ98-10C779-A51", "32", "6"], }, }; function twoArraysToObject(arr1, arr2) { return arr1.reduce((obj, item, index) => { obj[item] = arr2[index]; return obj; }, {}); } const desiredObject = {}; Object.keys(objects).forEach((key) => { const keyNamesArr = Object.keys(objects[key]); desiredObject[key] = twoArraysToObject(objects[key][keyNamesArr[0]], objects[key][keyNamesArr[1]]); }); console.log(desiredObject);

您可以使用objects object 的条目来获取键值对数组。 然后,您可以 map 这个键值对数组,以便每个值都更新为一个新的 object。这个新的 object 可以使用Object.fromEntries()构建,并将在以"DetailsKey"结尾的键处找到的数组映射到另一组键值对的数组,其中每个值都是数组中以"DetailsVal"结尾的键的关联值(我们可以使用索引i来获取相应的项)。 然后,您可以将映射objects的条目包装在对Object.fromEntries()的另一个调用中,这将从新的键值对数组中为您构建一个 object:

 const objects = { Battery: { batteryDetailsKey: ['serial_no', 'type', 'part_no'], batteryDetailsVal: [ 'HJ3CA19347410218LJ98 151 QC', 'Extended Range', '4P94-Q051', ], }, Modules: { moduleDetailsKey: ['serial_no', 'part_no', 'cell_count'], moduleDetailsVal: [ '8367532735006109322258160 50', 'LJ98-10C779-A51', '32', '6', ], }, }; const res = Object.fromEntries(Object.entries(objects).map(([key, value]) => { const innerEntries = Object.entries(value); const [, details] = innerEntries.find(([key]) => key.endsWith("DetailsKey")); const [, vals] = innerEntries.find(([key]) => key.endsWith("DetailsVal")); return [key, Object.fromEntries(details.map((key, i) => [key, vals[i]]))]; })); console.log(res);

如果您可以依赖 object 属性/值顺序Object.value()给您(最近才标准化),那么您可以删除.find()调用并使用索引获取您的密钥:

 const objects = { Battery: { batteryDetailsKey: ['serial_no', 'type', 'part_no'], batteryDetailsVal: [ 'HJ3CA19347410218LJ98 151 QC', 'Extended Range', '4P94-Q051', ], }, Modules: { moduleDetailsKey: ['serial_no', 'part_no', 'cell_count'], moduleDetailsVal: [ '8367532735006109322258160 50', 'LJ98-10C779-A51', '32', '6', ], }, }; const res = Object.fromEntries(Object.entries(objects).map(([key, value]) => { const [details, vals] = Object.values(value); return [key, Object.fromEntries(details.map((key, i) => [key, vals[i]]))]; })); console.log(res);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM