簡體   English   中英

比較兩個數組,並僅獲取與javascript / google-apps-script中的第1列數據匹配的數組

[英]Compare two arrays and obtain only one with data matching colum 1 in javascript/ google-apps-script

我對javascript不太有經驗,但是我一直在嘗試找到解決問題的方法,但沒有成功。 我有3個具有15000行和39列的數組,我需要比較它們以僅提取與單個數組中需要的條件匹配的值。

到目前為止,我已經有了這段代碼,並且可以正常工作,但一次只能比較大約1000行。 我找不到一些更快的解決方案? 已經嘗試尋找幾種解決方案和adpatar,但我找不到類似的問題。

任何幫助都非常歡迎。 提前致謝。

// ...definition of variables...
var newData = data3;
var novo =[]
var novo2 =[]
for(var i in data){
    var duplicate = false;
    for(var j in newData){
        //compare only if >0 to dont spend time in script
       if(data[i][33] > 0 || data[i][30] > 0 || newData[j][33] > 0 || newData[j][30] > 0) {
           //compare first column
           if(data[i].slice(0,1).toString() == newData[j].slice(0,1).toString()) {
               duplicate = true;
               var nd = newData[j].slice(30,34)
           }
       }
    }
    if(duplicate){
        novo.push(data[i].slice(0,4))
        novo2.push(nd)
    }
 }
 //set the values

編輯:每一行都有這種類型的數據:

[3976.0,Talonete c / rebordo maf sindolor .med。,20.8,14.61,6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 ,0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、2011年9月18日星期日23:00:00 GMT + 00:00 2011年8月20日星期三23:00:00 GMT + 00:00 ,0.0,ORTOMEDIFIFAR-IMPORTAÇAOEDISTRIBUIÇAODE ARTIGOS MEDICA,LaboratóriosIberpos,SA,GH0000,0.0]

[4286.0,PULSO ELASTICO TAM 1 BEIJE,5.15、3.2、6.0、0.0、0.0、0.0、0.0、1.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、1.0 ,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,2017年10月12日星期四23:00:00 GMT + 00:00 2017年10月12日星期四23:00:00 GMT + 00:00 2017年2月,N /D、N/D、GH0000、0.0]

[80105.0,LIMA LASER COM PEGA,6.35,3.65,23.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,星期三Jun 24 23:00:00 GMT + 00:00 2015,星期二七月09 23:00:00 GMT + 00:00 2013,0.0,N / D,N / D,GH0000、0.0]

您可以通過以下方式節省時間:首先為您的數據創建一個以item.slice(0,1).toString()為鍵的“哈希”,然后您可以找到匹配項而無需重復數據-哈希將為您提供如果有固定時間的比賽。 使用ES5,您可以使用普通對象來實現這樣的哈希:

// Create the hash:
var map = {};
for (var i = 0; i < data.length; i++) {
    var item = data[i];
    map[item.slice(0,1).toString()] = item;
}

// Iterate the newData array and match with the hash: 
for (var i = 0; i < newData.length; i++) {
    var item = newData[i];
    var match = map[item.slice(0,1).toString()];
    if (match) {
        novo.push(match.slice(0,4))
        novo2.push(item.slice(30,34))
    }
}

注意:我沒有包括> 0測試來保持對本質的解決方案,但您當然仍然可以這樣做。

我僅對您發送的數據進行了測試。 但是我認為這樣應該更快。 請測試完整數據。 問您您不理解某些代碼。 我只用過ES5,就像您說的那樣,您在Google appscript中使用過ES5

 var data1 = [ [3976.0, 'Talonete c/rebordo maf sindolor .med.', 20.8, 14.61, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 777.0, 0.0, 'Sun Sep 18 23:00:00 GMT+00:00 2011', 'Wed Aug 20 23:00:00 GMT+00:00 2014', 0.0, 'ORTOMEDIFAR-IMPORTAÇAO E DISTRIBUIÇAO DE ARTIGOS MEDICA, Laboratórios Iberpos, S.A', 'GH0000', 0.0], [4286.0, 'PULSO ELASTICO TAM 1 BEIJE', 5.15, 3.2, 6.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 'Thu Oct 12 23:00:00 GMT+00:00 2017', 'Thu Oct 12 23:00:00 GMT+00:00 2017', 2.0, 'N/D', 'N/D', 'GH0000', 0.0], [80105.0, 'LIMA LASER COM PEGA', 6.35, 3.65, 23.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 555.0, 1.0, 'Wed Jun 24 23:00:00 GMT+00:00 2015', 'Tue Jul 09 23:00:00 GMT+00:00 2013', 0.0, 'N/D', 'N/D', 'GH0000', 0.0] ]; var data2 = [ [3976.0, 'Talonete c/rebordo maf sindolor .med.', 20.8, 14.61, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 333.0, 0.0, 'Sun Sep 18 23:00:00 GMT+00:00 2011', 'Wed Aug 20 23:00:00 GMT+00:00 2014', 0.0, 'ORTOMEDIFAR-IMPORTAÇAO E DISTRIBUIÇAO DE ARTIGOS MEDICA, Laboratórios Iberpos, S.A', 'GH0000', 0.0], [4286.0, 'PULSO ELASTICO TAM 1 BEIJE', 5.15, 3.2, 6.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 'Thu Oct 12 23:00:00 GMT+00:00 2017', 'Thu Oct 12 23:00:00 GMT+00:00 2017', 2.0, 'N/D', 'N/D', 'GH0000', 0.0], [80105.0, 'LIMA LASER COM PEGA', 6.35, 3.65, 23.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 'Wed Jun 24 23:00:00 GMT+00:00 2015', 'Tue Jul 09 23:00:00 GMT+00:00 2013', 0.0, 'N/D', 'N/D', 'GH0000', 0.0] ]; var novo =[], novo2 =[]; filter = function(e){ return ((e[30] > 0) || (e[33] > 0)); }; data1 = data1.filter(filter); data2 = data2.filter(filter); data1.map(function(row1) { var slice = row1.slice(0,1).toString(); var nd = data2 .filter(function(row2) { return slice == row2.slice(0,1).toString();}) .map(function(row2) { return row2.slice(30,34); }); if (nd) nd.map(function(rowNd) { novo.push(rowNd.slice(0,4)); novo2.push(rowNd);} ); }) console.log(novo, novo2) 

我在Google Appscript上的經驗還表明,最慢的事情是從電子表格中獲取值並更新電子表格。 因此,請嘗試使用sheet.getRange()。setValues()和.getValues(),以便您一次可以獲取/設置多個值,而不是逐個單元地進行讀寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM