Javascript 解析 excel 文件并创建笛卡尔积

Javascript parse excel file and create cartesian product

我有一个包含两个 sheet 的 excel 文件。一个是包含 ID 列表的 source sheet。第二个sheet是三列的数据。

我正在尝试解析此文档并从两个 sheet 中创建笛卡尔积。 对于 source sheet 上的每个 ID,它需要与 data sheet.

上的每一行相结合

示例:

Sheet 1(来源):

ABC
DEF
GHI

Sheet 2(数据):

Bob, 20, Arizona
James, 30, California
Sam, 40, Florida

预期输出:

Bob, 20, Arizona, ABC
James, 30, California, ABC
Sam, 40, Florida, ABC

Bob, 20, Arizona, DEF
James, 30, California, DEF
Sam, 40, Florida, DEF

Bob, 20, Arizona, GHI
James, 30, California, GHI
Sam, 40, Florida, GHI

我正在使用 nodejs 解析此 xlsx 文件并遍历 sheet。我得到两个数组,每个数组都有正确的数据,如下所示。

[
  { SourceId: 'ABC' },
  { SourceId: 'DEF' },
  { SourceId: 'GHI' }
]
[
  { Name: 'Bob', Age: 20, Location: 'Arizona' },
  { Name: 'James', Age: 30, Location: 'California' },
  { Name: 'Sam', Age: 40, Location: 'Florida' }
]

我现在正在尝试将数据中的每一行映射到源中的每一行的两者结合起来。在我的示例中,有 3 行数据和 3 个源 ID。这可能会产生 9 个结果的输出。

如果这两个都是数组,那就很简单了,但是我无法弄清楚如何将它们添加到数据对象中。

代码:

var XLSX = require("xlsx");
var workbook = XLSX.readFile("data.xlsx");
var sheet_name_list = workbook.SheetNames;

sheet_name_list.forEach(function (y) {
  var worksheet = workbook.Sheets[y];
  var worksheetName = y;
  var headers = {};
  var data = [];
  var primarySet = [];

  for (z in worksheet) {
    if (z[0] === "!") continue;

    //parse out the column, row, and value
    var col = z.substring(0, 1);
    var row = parseInt(z.substring(1));
    var value = worksheet[z].v;

    //store header names
    if (row == 1) {
      headers[col] = value;
      continue;
    }

    if (worksheetName == "Source") {
      if (!primarySet[[row]]) {
        primarySet[row] = {};
      }
      primarySet[row][headers[col]] = value;
    }

    if (!data[row]) {
      data[row] = {};
    }
    data[row][headers[col]] = value;

  }
  //drop those first two rows which are empty
  data.shift();
  data.shift();
  console.log(data);

  /* Expected Output

  [
    { Name: 'Bob', Age: 20, Location: 'Arizona', SourceId: 'ABC' },
    { Name: 'James', Age: 30, Location: 'California', SourceId: 'ABC' },
    { Name: 'Sam', Age: 40, Location: 'Florida', SourceId: 'ABC' },

    { Name: 'Bob', Age: 20, Location: 'Arizona', SourceId: 'DEF' },
    { Name: 'James', Age: 30, Location: 'California', SourceId: 'DEF' },
    { Name: 'Sam', Age: 40, Location: 'Florida', SourceId: 'DEF' },

    { Name: 'Bob', Age: 20, Location: 'Arizona', SourceId: 'GHI' },
    { Name: 'James', Age: 30, Location: 'California', SourceId: 'GHI' },
    { Name: 'Sam', Age: 40, Location: 'Florida', SourceId: 'GHI' },

]

   */

});

有没有好的方法来处理这个问题,我基本上可以将源合并到数据中 n 次?

如何使用 flatMap 获得预期的输出:

var arr1 = [ { SourceId: 'ABC' }, { SourceId: 'DEF' }, { SourceId: 'GHI' }];
var arr2 = [ { Name: 'Bob', Age: 20, Location: 'Arizona' }, { Name: 'James', Age: 30, Location: 'California' }, { Name: 'Sam', Age: 40, Location: 'Florida' }];

var result = arr1.flatMap(({SourceId},i)=>arr2.map(val=>({...val, SourceId})));

console.log(result)