【问题标题】:how do you convert javascript object with arrays in to array of objects with corresponding name and value?如何将带有数组的 javascript 对象转换为具有相应名称和值的对象数组?
【发布时间】:2021-02-11 21:27:01
【问题描述】:

这里的程序员朋友,出于某种原因,我花了两天时间,但我无法正确完成此操作,请帮助我。 我有一个对象,每个键都有这样的数组:

var arraysObject = {
    "North American": [
        "CONUS",
        "NAMER",
        "CONUS/AK",
        "US-NC",
        "US-NE",
        "US-NW",
        "US-SC",
        "US-SE"
    ],
    "Oconus": [
        "ALASKA",
        "GUAM",
        "HAWAII",
        "POLAR",
        "US-SAMOA"
    ],
 }

我有一个已选择区域的列表,如下所示

var listOfAreas = ["CONUS", "GUAM","US-SAMOA"]

我想创建以下对象:

var result = [{
        "North American":"CONUS",
        "Oconus": "GUAM"
        },
        {
        "North American": "",
        "Oconus":"US-SAMOA"
        }]
        
            

请注意,仅当最后一个键已满并尽可能填充对象时,它才会创建一个新对象。在我的实现中,它为每个单独的字符串创建一个对象,并将其分配给键,然后使用 .map 推送它 这行不通。我希望它相应地填充每个对象并仅在必要时创建一个新对象。感谢你的帮助。 最好的, 一个假人。

【问题讨论】:

  • [CONUS, NAMER] 这样的两个“北美”结果会发生什么情况?因为似乎“唯一”值应该是键,而不是相反。
  • 我无法理解您尝试创建的数据结构。你能澄清一下吗?
  • 数据结构是一个对象数组,基本上是第一个对象的逆,只有所​​选数组中的字符串。这用于创建带有引导程序的表,并且需要采用该格式。
  • @RandyCasburn CONUS 是北美数组中数组列表中唯一选定的字符串
  • @TadewosBellete - 是的,我了解您提供的示例。我的问题与可能包含来自北美的两个元素的不同输入数组有关。在您的应用中会发生这种情况吗?

标签: javascript arrays sorting object


【解决方案1】:

您可以采用一个对象来跟踪键的索引,并采用一个辅助对象来恢复值/键关系。

const
    arraysObject = { "North American": ["CONUS", "NAMER", "CONUS/AK", "US-NC", "US-NE", "US-NW", "US-SC", "US-SE"], "Oconus": ["ALASKA", "GUAM", "HAWAII", "POLAR", "US-SAMOA"] },
    keys = Object.fromEntries(Object.entries(arraysObject).flatMap(([k, a]) => a.map(v => [v, k]))),
    EMPTY = Object.fromEntries(Object.keys(arraysObject).map(k => [k, ''])),
    listOfAreas = ["CONUS", "GUAM","US-SAMOA"],
    indices = {},
    result = [];

listOfAreas.forEach(value => {
    const key = keys[value];
    indices[key] ??= 0;
    (result[indices[key]++] ??= { ...EMPTY })[key] = value;
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 但是等等,它在执行过程中给了我重复的值。
  • 你从哪里得到重复的?值应该是唯一的。
  • 哦,调试显示所选列表由于某种原因有重复项。 .map 给出了一些重复的方法。不是你的代码哈哈
  • 它从keys 对象中获取key,用这个键为索引对象分配零或者如果不是null 或未定义则保留该值`(logical nullish assignment ??=,这是使用的稍后传播一个只有空字符串作为值的对象)。
  • 在最后一行中,使用来自indices 的索引(索引递增)进行分配,检查nullundefined,对象在此分配大小写,最后通过索引和键将值放到正确的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 2021-09-24
相关资源
最近更新 更多