首页 > 解决方案 > 对两个数组执行查找并将第二个数组中的元素添加到第一个数组

问题描述

我有两个数组,我已经循环以匹配第二个数组vals1中第一个数组的元素vals2。如果元素(索引 [i][0])vals1出现在vals2(索引 [j][0])中,我需要对元素(索引 [j][1])进行分级vals2并推送到vals1(或创建一个新的包含所有元素的数组vals1和一个来自vals2)如果它不存在,我想分配“未分配”,我将使用来自 `vals2` 的元素 [j] [1]

So:
If vals1 = [[ 'item3', 3, 2, 6 ],[ 'item6', 4, 7, 28 ],[ 'item8', 1, 8, 8 ],[ 'item2', 6, 12, 72 ]]
and vals2 = [[ 'item1', 15 ],[ 'item2', 4 ],[ 'item3', 1 ],[ 'item4', 2 ]] 
I'm looking for the following result:
[[ 'item3', 3, 2, 6,1 ],[ 'item6', 4, 7, 28,'Unassigned' ],[ 'item8', 1, 8, 8,Unassigned' ],[ 'item2', 6, 12, 72,4 ]]

我到目前为止的脚本是:

function lookup () {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var sheet1 = ss.getSheetByName('Sheet11');
  var vals1 = sheet1.getRange(2,1,sheet1.getLastRow(),sheet1.getLastColumn()).getValues();

  var sheet2 = ss.getSheetByName('Sheet12');
  var vals2 = sheet2.getRange(2,1,sheet2.getLastRow(),sheet2.getLastColumn()).getValues();

  console.log(vals1);
  [ 
    [ 'item3', 3, 2, 6 ], 
    [ 'item6', 4, 7, 28 ],  
    [ 'item8', 1, 8, 8 ],
    [ 'item2', 6, 12, 72 ],
  ]
  console.log(vals2);
 [ 
  [ 'item1', 15 ],
  [ 'item2', 4 ],
  [ 'item3', 1 ],
  [ 'item4', 2 ]
 ] 

 var result =[]; 

 for(var i=0;i<vals1.length;i++){
   for(var j=0;j<vals2.length;j++){
     var desc = vals1[i][0]
     var qty = vals1[i][1]
     var selling = vals1[i][2]
     var total = vals1[i][3]
     var desc2 = vals2[j][0]
     var cost = vals2[j][1]
     
     
     if(desc === desc2){
       result.push([desc,qty,selling,total,cost]) 
     } else {
       result.push([desc,qty,selling,total,'Unassigned'])
     }

   }
 } 
 console.log(result)
} 

我得到的结果是:

[ [ 'item3', 3, 2, 6, 'Unassigned' ],
  [ 'item3', 3, 2, 6, 'Unassigned' ],
  [ 'item3', 3, 2, 6, 1 ],
  [ 'item3', 3, 2, 6, 'Unassigned' ],
  [ 'item3', 3, 2, 6, 'Unassigned' ],
  [ 'item3', 3, 2, 6, 'Unassigned' ],
  [ 'item2', 4, 7, 28, 'Unassigned' ],
  [ 'item2', 4, 7, 28, 4 ],
  [ 'item2', 4, 7, 28, 'Unassigned' ],
  [ 'item2', 4, 7, 28, 'Unassigned' ],
  [ 'item2', 4, 7, 28, 'Unassigned' ],
  [ 'item2', 4, 7, 28, 'Unassigned' ],
  [ 'item4', 1, 8, 8, 'Unassigned' ],
  [ 'item4', 1, 8, 8, 'Unassigned' ],
  [ 'item4', 1, 8, 8, 'Unassigned' ],
  [ 'item4', 1, 8, 8, 2 ],
  [ 'item4', 1, 8, 8, 'Unassigned' ],
  [ 'item4', 1, 8, 8, 'Unassigned' ],
  [ 'item2', 6, 12, 72, 'Unassigned' ],
  [ 'item2', 6, 12, 72, 4 ],
  [ 'item2', 6, 12, 72, 'Unassigned' ],
  [ 'item2', 6, 12, 72, 'Unassigned' ],
  [ 'item2', 6, 12, 72, 'Unassigned' ],
  [ 'item2', 6, 12, 72, 'Unassigned' ],
  [ 'item4', 3, 34, 102, 'Unassigned' ],
  [ 'item4', 3, 34, 102, 'Unassigned' ],
  [ 'item4', 3, 34, 102, 'Unassigned' ],
  [ 'item4', 3, 34, 102, 2 ],
  [ 'item4', 3, 34, 102, 'Unassigned' ],
  [ 'item4', 3, 34, 102, 'Unassigned' ],
  [ 'item3', 2, 8, 16, 'Unassigned' ],
  [ 'item3', 2, 8, 16, 'Unassigned' ],
  [ 'item3', 2, 8, 16, 1 ],
  [ 'item3', 2, 8, 16, 'Unassigned' ],
  [ 'item3', 2, 8, 16, 'Unassigned' ],
  [ 'item3', 2, 8, 16, 'Unassigned' ],
  [ 'item1', 8, 32, 256, 15 ],
  [ 'item1', 8, 32, 256, 'Unassigned' ],
  [ 'item1', 8, 32, 256, 'Unassigned' ],
  [ 'item1', 8, 32, 256, 'Unassigned' ],
  [ 'item1', 8, 32, 256, 'Unassigned' ],
  [ 'item1', 8, 32, 256, 'Unassigned' ],
  [ 'item1', 21, 32, 672, 15 ],
  [ 'item1', 21, 32, 672, 'Unassigned' ],
  [ 'item1', 21, 32, 672, 'Unassigned' ],
  [ 'item1', 21, 32, 672, 'Unassigned' ],
  [ 'item1', 21, 32, 672, 'Unassigned' ],
  [ 'item1', 21, 32, 672, 'Unassigned' ],
  [ 'item2', 2, 7, 14, 'Unassigned' ],
  [ 'item2', 2, 7, 14, 4 ],
  [ 'item2', 2, 7, 14, 'Unassigned' ],
  [ 'item2', 2, 7, 14, 'Unassigned' ],
  [ 'item2', 2, 7, 14, 'Unassigned' ],
  [ 'item2', 2, 7, 14, 'Unassigned' ],
  [ 'item5', 4, 6, 24, 'Unassigned' ],
  [ 'item5', 4, 6, 24, 'Unassigned' ],
  [ 'item5', 4, 6, 24, 'Unassigned' ],
  [ 'item5', 4, 6, 24, 'Unassigned' ],
  [ 'item5', 4, 6, 24, 4 ],
  [ 'item5', 4, 6, 24, 'Unassigned' ],
  [ 'item8', 9, 8, 72, 'Unassigned' ],
  [ 'item8', 9, 8, 72, 'Unassigned' ],
  [ 'item8', 9, 8, 72, 'Unassigned' ],
  [ 'item8', 9, 8, 72, 'Unassigned' ],
  [ 'item8', 9, 8, 72, 'Unassigned' ],
  [ 'item8', 9, 8, 72, 'Unassigned' ],
  [ 'item3', 16, 2, 32, 'Unassigned' ],
  [ 'item3', 16, 2, 32, 'Unassigned' ],
  [ 'item3', 16, 2, 32, 1 ],
  [ 'item3', 16, 2, 32, 'Unassigned' ],
  [ 'item3', 16, 2, 32, 'Unassigned' ],
  [ 'item3', 16, 2, 32, 'Unassigned' ],
  [ 'item7', 32, 6, 192, 'Unassigned' ],
  [ 'item7', 32, 6, 192, 'Unassigned' ],
  [ 'item7', 32, 6, 192, 'Unassigned' ],
  [ 'item7', 32, 6, 192, 'Unassigned' ],
  [ 'item7', 32, 6, 192, 'Unassigned' ],
  [ 'item7', 32, 6, 192, 'Unassigned' ],
  [ 'item6', 1, 21, 21, 'Unassigned' ],
  [ 'item6', 1, 21, 21, 'Unassigned' ],
  [ 'item6', 1, 21, 21, 'Unassigned' ],
  [ 'item6', 1, 21, 21, 'Unassigned' ],
  [ 'item6', 1, 21, 21, 'Unassigned' ],
  [ 'item6', 1, 21, 21, 'Unassigned' ],

我正在使用的数据集分别有 1701 行和 228 行。当我最初运行脚本时,它打印了超过 400 000 行数据。

任何帮助将不胜感激

标签: javascriptarraysgoogle-apps-scriptgoogle-sheets

解决方案


  • 遍历第一个二维数组 ( vals1) 中的所有项目。例如,您可以使用forEach来做到这一点。
  • 对于 中的每个项目vals1,您都希望在 中查找相同的项目vals2。你可以使用find。由于 items 是每个内部数组中的第一个元素,因此您必须检查是否item1[0] === item2[0].
  • 如果找到该项目,则将相应的值item2[1]送到该项目的内部数组中vals1
  • 如果未找到该项目(find返回undefined),则改为推送字符串"Unassigned"

代码片段:

function lookup(vals1, vals2) {
  vals1.forEach(item1 => {
    const item2 = vals2.find(item2 => item1[0] === item2[0]);
    const newValue = item2 ? item2[1] : "Unassigned";
    item1.push(newValue);
  });
  return vals1;
}

常规函数语法:

function lookup(vals1, vals2) {
  vals1.forEach(function(item1) {
    const item2 = vals2.find(function(item2) {
      return item1[0] === item2[0]
    });
    const newValue = item2 ? item2[1] : "Unassigned";
    item1.push(newValue);
  });
  return vals1;
}

推荐阅读