Javascript 在两个数组上执行查找,并将元素从第二个数组添加到第一个数组

Javascript 在两个数组上执行查找,并将元素从第二个数组添加到第一个数组,javascript,arrays,google-apps-script,google-sheets,Javascript,Arrays,Google Apps Script,Google Sheets,我有两个数组,我循环使用它们来匹配第二个数组中第一个数组vals1中的元素。如果vals1中的元素(索引[i][0])出现在vals2(索引[j][0]),我需要将vals2中的元素(索引[j][1])分级并推送到vals1(或者创建一个包含vals1的所有元素和vals2中的元素的新数组),如果它不存在,我想分配“Unassigned”,在这里我会使用来自“``vals2”的元素[j][1]`` So: If vals1 = [[ 'item3', 3, 2, 6 ],[ 'item6', 4

我有两个数组,我循环使用它们来匹配第二个数组中第一个数组
vals1
中的元素。如果
vals1
中的元素(索引[i][0])出现在
vals2
(索引[j][0]),我需要将
vals2
中的元素(索引[j][1])分级并推送到
vals1
(或者创建一个包含
vals1
的所有元素和
vals2
中的元素的新数组),如果它不存在,我想分配“Unassigned”,在这里我会使用来自“``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)
} 

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

任何帮助都将不胜感激

请尝试以下方法:

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 ] ]
  • 遍历第一个二维数组(
    vals1
    )中的所有项。例如,您可以使用
  • 对于
    vals1
    中的每个项目,您希望在
    vals2
    中查找相同的项目。你可以用它。由于项目是每个内部数组中的第一个元素,因此必须检查
    item1[0]===item2[0]
  • 如果找到该项,则将相应的值
    item2[1]
    添加到
    vals1
    中该项的内部数组中
  • 如果未找到该项(
    find
    返回
    undefined
    ),则按字符串
    “Unassigned”
代码段: 常规函数语法:
传奇@Cooper。这正是我想要的。谢谢你的帮助。如果可以的话,我有两个问题想问你?你能简单地解释一下这是如何工作的吗?我还是个新手。我熟悉.map和.indexOf方法,但只在较旧语法中使用过它们。再次感谢你的帮助,这将为我节省大量的时间。我的错。我现在在你的回答中看到了你的评论。我得到了它。有道理。谢谢你的回复@lamblichus。我一定会应用这个解决方案。“我会告诉你我过得怎么样,但这也很有意义。”兰布利库斯。所以我在一个单独的项目中实现了你的查找方法,它肯定能完成这项工作。如果我是诚实的,我可能会继续使用这个方法,因为我更了解它。再次感谢您的回复。@lamblichus,您是否可以使用常规函数语法编写上述内容?我不擅长理解或调整箭头功能。我想使用您在单独的用例中建议的方法,但我对arrow函数语法有点纠结。@ChrisWard很抱歉,我错过了您最后的评论。我添加了一个带有经典函数语法的代码片段,希望对您有所帮助。@lamblichus一点问题都没有。感谢您提供了经典语法片段,这肯定会有所帮助。这种查找方法对我来说真的很方便。
[ [ 'item3', 3, 2, 6, 1 ],
  [ 'item6', 4, 7, 28, 'UnAssigned' ],
  [ 'item8', 1, 8, 8, 'UnAssigned' ],
  [ 'item2', 6, 12, 72, 4 ] ]
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;
}