【问题标题】:perform lookup on two arrays and add element from second array to first array对两个数组执行查找并将第二个数组中的元素添加到第一个数组
【发布时间】:2021-02-08 21:56:18
【问题描述】:

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

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 行数据。

任何帮助将不胜感激

【问题讨论】:

    标签: javascript arrays google-apps-script google-sheets


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

    代码sn-p:

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

    【讨论】:

    • 感谢您的回复@lamblichus。我一定会应用这个解决方案。会让你知道我是怎么过的,但这也很有意义。
    • @lamblichus。所以我在我正在使用的一个单独的项目中实现了你的查找方法,它确实可以完成这项工作。老实说,我可能会纯粹使用这种方法,因为我更了解它。再次感谢您的回复。
    • @lamblichus,您是否可以使用常规函数语法编写上述内容?我不擅长理解或适应箭头功能。我想使用您在单独的用例中建议的方法,但在箭头函数语法方面有点挣扎。
    • @ChrisWard 很抱歉我错过了您的最后一条评论。我添加了一个经典函数语法的代码sn-p,希望对你有帮助。
    • 完全没问题@lamblichus。感谢您包含经典语法 sn-p,它肯定会有所帮助。这种查找方法对我来说非常方便。
    【解决方案2】:

    试试这个:

    function myFunc( ) {
      let v1 = [[ 'item3', 3, 2, 6 ],[ 'item6', 4, 7, 28 ],[ 'item8', 1, 8, 8 ],[ 'item2', 6, 12, 72 ]];
      let v2 = [[ 'item1', 15 ],[ 'item2', 4 ],[ 'item3', 1 ],[ 'item4', 2 ]]; 
      let v0 =v2.map(r=>{return r[0]});//just getting all of the the first elements of v2 in a flatten array for  use with indexOf
      v1.forEach((r,i)=>{
        let idx=v0.indexOf(r[0]); 
        if(idx>-1) {//if idx is greater than -1 the matches first element v2
          v1[i].push(v2[idx][1]);
        }else{
          v1[i].push('UnAssigned')
        }
      });
      console.log(v1);
    }
    

    输出是:

    [ [ 'item3', 3, 2, 6, 1 ],
      [ 'item6', 4, 7, 28, 'UnAssigned' ],
      [ 'item8', 1, 8, 8, 'UnAssigned' ],
      [ 'item2', 6, 12, 72, 4 ] ]
    

    【讨论】:

    • 传奇@Cooper。这完全符合我的要求。谢谢您的帮助。如果可以的话,我有两个问题要问你?您能否简要解释一下这是如何工作的?我对此还是很陌生。我熟悉 .map 和 .indexOf 方法,但只将它们与旧语法一起使用。再次感谢您的帮助,这将为我节省大量时间。
    • 我的错。我现在在您的答案中看到了您的 cmets。我得到了它。有道理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2022-11-16
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多