开发者问题收集

GAS - 从数组中删除重复项的问题

2020-03-19
190

我有一列包含一组数字,我正在为查询做准备。其中一些数字有前导零,我需要将其保留在有前导零和没有前导零的列表中。

到目前为止,我所做的是创建一个有前导零和没有前导零的值列。下面是我在列上 getValues 时数组的示例。

[[1],[2],[001],[002],[1],[2]]

最终结果应该是... [[1],[2],[001],[002]]

最后两个被删除,因为它们是重复的,我只需要在数组中使用它一次。

这是我正在尝试但遇到的问题:

var array = sh.getRange(1,sh.getLastColumn(),sh.getLastRow(),1).getValues();
var uniqueArray = removeDuplicates(array)

function removeDuplicates(myArray){
  var newArray = [];
  myArray.forEach(function(x){
    if(newArray.indexOf(x[0]) === -1){
      newArray.push(x[0]);
    }                   
  });
}

错误:数组返回为 null,然后当我尝试获取 uniqueArray.length 时,它会给我 TypeError:无法读取未定义的属性“length”

我也尝试过:

var uniqueArray = Array.from(new Set(array));

这似乎不那么费力,我喜欢它,但是它返回所有值。它不会删除重复项。

我做错了什么?最好的方法是什么?我该如何解决这个问题?

2个回答

使用 Set

const removeDuplicates = arr2d => [...new Set(arr2d.flat())].map(e => [e]);
console.info(removeDuplicates([[1],[2],[001],[002],[1],[2]]))

使用 getDisplayValues 获取字符串

TheMaster
2020-03-20

尝试一下:

function removeDups(mA){
  //Logger.log('vA:',mA);
  let s=new Set();
  mA.forEach(function(a){
    a.forEach(function(e) {
      s.add(e);//add elements to a set
    });
  });
  //Logger.log('set: %s',s.keys());
  const oA=[...s];//expand the set back to a unique array
  //Logger.log('oA: %s',oA);
  return oA;
}

注意:这需要新的 v8 引擎

此外,我注意到记录器输出报告到与您查看执行时相同的页面的速度要快得多。

JavaScript Set

Set.add()

Cooper
2020-03-19