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