【问题标题】:Compare two arrays and obtain only one with data matching colum 1 in javascript/ google-apps-script比较两个数组,只得到一个与 javascript/ google-apps-script 中的数据匹配列 1 的数组
【发布时间】:2018-02-28 01:28:40
【问题描述】:

我在 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, 9 月 18 日星期日 23:00:00 GMT+00:00 2011 年 8 月 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,2017 年 10 月 12 日星期四 23:00:00 GMT+00:00,2017 年 10 月 12 日星期四 23:00:00 GMT+00:00, 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, 6 月 24 日星期三 23:00:00 GMT+00:00 2015, 7 月 9 日星期二 23:00:00 GMT+00:00 2013, 0.0 , N/D, N/D, GH0000, 0.0]

【问题讨论】:

  • 您能否明确提及问题中的条件?
  • @void 我想用截图的代码你可以理解,但简而言之,我打算比较每个数组的第 1 列,并从存在的数组中添加相同的行数据,如果值​​​​大于 0
  • @SérgioSá 我们可以改进您的代码,但请分享一些数据,以便我们可以运行代码。只需大约 5-10 条记录就足够了
  • @NelsonTeixeira 谢谢,我编辑了我的问题。

标签: javascript arrays google-apps-script


【解决方案1】:

您可以通过首先为您的数据创建一个以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))
    }
}

注意:我没有包含 &gt; 0 测试以保持解决方案的本质,但您当然仍然可以这样做。

【讨论】:

  • @tricot 谢谢。你可能会杀了我,但我没有说它在谷歌 appscript 中,它给了我一个错误:语法错误。 (第 81 行,文件“代码”),即:` var map = new Map(data, item => [item.slice(0,1).toString(), item]);`
  • link ES6 不被支持 :(
  • 太棒了,速度非常快,但是如何与第三个数组进行比较?并得到类似 'novo3.push(match2.slice(35,36)'?
  • 这确实是一个新问题。您想将第三个数组与什么进行比较?使用data,使用newData,还是两者都使用?您可以创建第二个散列,或将两个数组合并到一个散列中,但这完全取决于要比较的对象。也许您应该先自己尝试一下,然后如果您仍然遇到问题,请提出一个特定的(新)问题。
  • 你是对的,是另一个问题。我打算与您的代码的结果进行比较,但我通过在电子表格中设置值并返回使用相同的代码解决了这个问题。非常感谢。
【解决方案2】:

我仅使用您发送的数据进行了测试。但我认为这样应该快得多。请用完整的数据进行测试。问你有没有看懂的代码。正如你所说,我只使用了 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() 这样您就可以一次获取/设置多个值,而不是逐个单元格地读取和写入。

【讨论】:

  • 我不明白如何使用过滤器,(给我一个错误)但无论如何,如果没有它,结果是项目 30-34 的 2 倍。感谢任何方式
  • 过滤器使用起来非常简单。阅读本文,如果您有任何疑问,请询问:developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
  • se vc precisar de algum auxílio em português é só abrir um chat :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
相关资源
最近更新 更多