【问题标题】:map two 1D arrays into a 2D array and then fill with known values将两个一维数组映射成一个二维数组,然后用已知值填充
【发布时间】:2019-07-13 23:21:40
【问题描述】:

我只是想知道解决这个问题的最佳方法。我有两个需要合并到网格中的单维数组,实际上第一个数组变成了行,第二个数组变成了列 - 两者的大小都未知。

我在考虑嵌套循环和 .push,但有没有更优雅的解决方案。

问题的第二部分有点棘手。每个网格单元都将根据行和列数据分配一个键。我有一个包含此键的第三个数组,作为数组索引中对象的属性,我需要将此对象注入(或链接)到 2D 数组中的正确单元格。通常,大约 80% 的网格将在第三个数组中具有关联的对象。

数据集并不庞大;最大的网格只有大约 400 个单元,因此迭代解决方案可以工作,但感觉很脏。有没有更好的“计算机科学”方法或 javascript 数组方法可以让我实现我想要的。

如果没有,在迭代 items 数组和尝试在 2D 数组中找到正确的单元格或迭代 2D 数组并尝试在 items 数组中找到匹配对象之间是否存在任何重大权衡,请记住我正在匹配 item 属性而不是键。

下面的示例代码

let arrRow = [
    {"code":"S", "desc":"small"},
    {"code":"M", "desc":"med"},
    {"code":"L", "desc":"large"}
];
let arrCol = [
    {"code":"R", "desc":"Red"},
    {"code":"G", "desc":"Green"},
    {"code":"B", "desc":"Blue"}
];
let arrItems= [
    {"item":"SR", "desc":"Small Red"},
    {"item":"SB", "desc":"Small Blue"},
    {"item":"MB", "desc":"Med Blue"},
    {"item":"LB", "desc":"Large Blue"},
    {"item":"SG", "desc":"Small Green"},
    {"item":"LG", "desc":"Large Green"}
 ];

根据受访者的要求。期望的结果是

[
  [
    {"key":"SR", "value":{"item":"SR", "desc":"Small Red"}},
    {"key":"SG", "value":{"item":"SG", "desc":"Small Green"}},
    {"key":"SB", "value":{"item":"SB", "desc":"Small Blue"}
  ],
    {"key":"MR", "value":{}},
    {"key":"MG", "value":{}},
    {"key":"MB", "value":{"item":"MB", "desc":"Med Blue"}}
  ],
    {"key":"LR", "value":{}},
    {"key":"LG", "value":{"item":"LG", "desc":"Large Green"}},
    {"key":"LB", "value":{"item":"LB", "desc":"Large Blue"}}
  ]

]

或者,该值可能只是项数组中元素的索引,这可能更节省内存

【问题讨论】:

  • 请添加想要的结果和您尝试过的内容。
  • 每个方法都将使用某种形式的迭代,无论是自己编写的还是幕后的。例如Array.prototype.reduceArray.prototype.filter 将遍历所有值。我也同意妮娜的评论。
  • 你确定你真的需要一个二维数组吗?你可能有很多多余的值(如果我理解正确的话)。
  • 是的,我想要“空”值作为项目的一部分,需要可视化缺失的组合。在 SQL 世界中,这将是一个 CROSS JOIN(或笛卡尔积)

标签: javascript arrays multidimensional-array ecmascript-6


【解决方案1】:

您可以使用 Map 获取数据并迭代行和列。

var arrRow = [{ code: "S", desc: "small" }, { code: "M", desc: "med" }, { code: "L", desc: "large" }],
    arrCol = [{ code: "R", desc: "Red" }, { code: "G", desc: "Green" }, { code: "B", desc: "Blue" }],
    arrItems = [{ item: "SR", desc: "Small Red" }, { item: "SB", desc: "Small Blue" }, { item: "MB", desc: "Med Blue" }, { item: "LB", desc: "Large Blue" }, { item: "SG", desc: "Small Green" }, { item: "LG", desc: "Large Green" }],
    map = arrItems.reduce((m, o) => m.set(o.item, o), new Map),
    result = arrRow.map(r => arrCol.map(c => (map.get(r.code + c.code) || {}).desc || ''));

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

【讨论】:

  • 美丽的妮娜,比我虚弱的头脑所能想象的要优雅得多。非常感谢。这不完全是我需要的答案,但它让我朝着正确的方向前进。我将使用您的代码运行,其余的由我自己解决。
猜你喜欢
  • 2012-03-08
  • 2014-09-03
  • 2021-10-29
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
相关资源
最近更新 更多