Скрипт Google Apps: объединение массивов при совпадении обоих массивов - PullRequest
1 голос
/ 17 апреля 2020

Фон

У меня есть два массива (Массив 1 и Массив 2). Оба они имеют тип идентификатора (столбец 2 массива 1 и столбец 0 массива 2). Я хочу объединить два массива по вертикали, только если в этом идентификаторе есть совпадение.

Начальные массивы:

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]];

Методология

It мне кажется, что наиболее эффективный способ сделать это было бы:

  1. Создать пустой массив.
  2. Pu sh Массив 1 данных в массив 3, если столбец ID делает совпадение с единицей в массиве 2.
  3. Pu sh Данные массива 2 в массив 3, где столбец идентификатора совпадает с массивом 3. Мы также должны добавлять только столбцы 1 и 2 массива 2, поэтому мы не Дублирование столбца идентификатора.

То, что я пробовал

В шаге 2 я пытался сделать Pu sh Array 1 to Array 3 с pu sh и карта комбинированная, как показано ниже, но она не работает должным образом. Мое намерение состояло в том, чтобы взять каждый ряд массива 1, пропустить его через каждый ряд массива 2, чтобы проверить совпадение; если есть совпадение, то pu sh для массива 3.

Для шага 3 я думал о том, чтобы взять каждый ряд столбца 2 массива 3, пропустить его через каждый ряд столбца 0 массива 2, и когда найдя совпадение, сопоставьте их с массивом 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] } ) }));

Ответы [ 4 ]

1 голос
/ 17 апреля 2020
  • Используйте map для создания карты массива2.
  • Фильтр из массива1 в зависимости от того, есть ли у карты идентификатор этого массива.
  • Поскольку фильтр имеет значение oop, можно изменить строку внутри фильтра

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(([row0, ...rest]) => array2Map.set(row0, rest));

const out = array1.filter(row => array2Map.has(row[2]) && row.push(...array2Map.get(row[2])));
console.info(out)
1 голос
/ 17 апреля 2020

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 голосов
/ 17 апреля 2020

Вот альтернативный подход, который может вас заинтересовать.

Теперь, когда у нас есть среда выполнения V8 в скрипте приложений, вы можете использовать стороннюю библиотеку, такую ​​как Ala SQL, для выполнения сложные SQL запросы.

Просто скопируйте и вставьте последнюю версию Ala SQL ( full или minified ) в собственный файл сценария в вашем Проект Apps Script.

Затем вы можете запускать такие запросы:

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 для выполнения всевозможных сложных запросов по нескольким наборам данных.

0 голосов
/ 17 апреля 2020

Я думаю, что это должно помочь вам:

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)

Ссылка песочницы

...