Google Apps脚本:两个数组之间都存在匹配项时合并数组

问题描述 投票:1回答:4

背景

我有两个数组(数组1和数组2)。它们都共享ID类型(阵列1的第2列和阵列2的第0列)。我只想在该ID中存在匹配项时垂直合并两个数组。

起始数组:

array1 = [[AB2C, Red, 113]       <--Match
          [BE4F, Green,164]
          [AE3G, Blue, 143]];    <--Match

array2 = [[143, FabricB2, W5]    <--Match
          [189, FabricC9, W4]
          [113, FabricA3, W5]];  <--Match

所需的结尾数组

array3 = [[AB2C, Red, 113, FabricA3, W5]
          [AE3G, Blue, 143, FabricB2, W5]];

方法

在我看来,最有效的方法是:

  1. 创建一个空数组。
  2. 如果ID列与数组2中的一个匹配,则将数组1的数据推送到数组3。
  3. 将数组2的数据推送到ID列与数组3匹配的数组3。我们还应该仅添加数组2的列1和2,因此我们不会复制ID列。

我尝试过的

对于第2步,我一直试图通过如下所示的push and map组合将Array 1推到Array 3,但是它不能正常工作。我的意图是获取数组1的每一行,将其遍历数组2的每一行以检查是否匹配;如果有匹配项,则推到数组3。

对于第3步,我的想法是获取数组3的第2列的每一行,将其遍历数组2的第0列的每一行,并在找到匹配项时将其与数组3结合起来。第2步以便达到此目的。

非常感谢您的帮助!

array1 = [[AB2C, Red, 113]
          [BE4F, Green,164]
          [AE3G, Blue, 143]];

array2 = [[143, FabricB2, W5]
          [189, FabricC9, W4]
          [113, FabricA3, W5]];

array3 = [];

array3.push(array1.map( function(e) { return e[2] == array2.map ( function (f) { return f[0] } ) }));
javascript arrays google-apps-script concat
4个回答
0
投票

我认为这应该为您解决问题:

let array1 = [['AB2C', 'Red', 113], ['BE4F', 'Green',164], ['AE3G', 'Blue', 143]];

let array2 = [[143, 'FabricB2', 'W5'], [189, 'FabricC9', 'W4'], [113, 'FabricA3', 'W5']];

let array3 = []
array1.forEach(i => {
  let match = i[2]
  array2.forEach(j => {
    if(j[0] === match) {
      array3.push([...i, j[1], j[2]])
    }
  })
})

console.log(array3)

Sandbox Link


0
投票

array1 = [
  ['AB2C', 'Red', 113],
  ['BE4F', 'Green', 164],
  ['AE3G', 'Blue', 143],
];

array2 = [
  [143, 'FabricB2', 'W5'],
  [189, 'FabricC9', 'W4'],
  [113, 'FabricA3', ' W5'],
];


const res = array1
  .map(x => array2
    .filter(y => y[0] === x[2])
    .map(y => [x[0], x[1], ...y]))
  .flatMap(x => x)

console.log(res)

0
投票
  • 使用map创建array2的映射。
  • [Filter out array1根据Map是否具有此数组的ID。
  • 由于过滤器是一个循环,可以修改过滤器内的行

const array1 = [
  ['AB2C', 'Red', 113],
  ['BE4F', 'Green', 164],
  ['AE3G', 'Blue', 143],
];

const array2 = [
  [143, 'FabricB2', 'W5'],
  [189, 'FabricC9', 'W4'],
  [113, 'FabricA3', ' W5'],
];

const array2Map = new Map;
array2.forEach(row => array2Map.set(row[0], [row[1],row[2]]));

const out = array1.filter(row => array2Map.has(row[2]) && row.push(...array2Map.get(row[2])));
console.info(out)

0
投票

这是您可能感兴趣的另一种方法。

现在我们在Apps脚本中具有V8运行时,您可以利用AlaSQL之类的第三方库来执行复杂的SQL查询。

只需将最新版本的AlaSQL(fullminified)复制并粘贴到您的Apps脚本项目中的脚本文件中即可。

然后您可以运行如下查询:

const arr1 = [
  ['AB2C', 'Red', 113],
  ['BE4F', 'Green', 164],
  ['AE3G', 'Blue', 143],
].map( ([code, color, id]) => ({id, color, code}));

const arr2 = [
  [143, 'FabricB2', 'W5'],
  [189, 'FabricC9', 'W4'],
  [113, 'FabricA3', 'W5'],
].map( ([id, fabric, textile]) => ({id, fabric, textile}));

const query = `
    SELECT arr1.id, arr1.code, arr1.color, arr2.fabric, arr2.textile
    FROM ? AS arr1
    INNER JOIN ? AS arr2 ON arr1.id = arr2.id
`;

var res = alasql(
        query, 
        [arr1, arr2]
    ).map(
        ({id, code, color, fabric, textile}) => [code, color, id, fabric, textile]
    );

console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/alasql/0.5.5/alasql.min.js"></script>

我对您的数据表有一些自由,将它们从数组数组转换为对象数组,然后使用解构分配再次返回。这种方法的真正优势在于,它允许您利用标准SQL在多个数据集中运行各种复杂的查询。

© www.soinside.com 2019 - 2024. All rights reserved.