如何只获取2d数组的唯一值

时间:2014-10-12 11:44:37

标签: google-apps-script

我需要从以下地址获取以下2d数组:

[[选项10,2.0],[选项10,2.0],[选项9,1.0],[选项7,1.0]]

[[选项10,2.0],[选项9,1.0],[选项7,1.0]]

我发现这篇文章(Splitting a 2D array using some() , by date, avoiding duplicates. Just want 1 unique email, not row. Where am i wrong here?)有一种非常有效的获取唯一值的方法,但我无法弄清楚如何将它应用到我的情况中。

2 个答案:

答案 0 :(得分:1)

您的用例比您所指的用例更简单。

试试这个例子:

function myFunction() {
  var source = [['Option 10', 2], ['Option 10', 2], ['Option 9', 1], ['Option 7', 1]];
  var dest = [];
  dest.push(source[0]);
  for(var n = 1 ; n< source.length ; n++){
    if(dest.join().indexOf(source[n].join()) == -1){dest.push(source[n])};
  }
  Logger.log(dest);
}

答案 1 :(得分:1)

因为&#39; unique&#39;并不总是很容易描述,我经常使用的模式实际上是使用ES5阵列图/滤波函数改变Serge的正确答案。

已修改的版本:

function hash(arr) {

  // in this case the hash method is the same as Serge's Array.join() method,
     but could be customised to suit whatever condition you need to generate
     bespoke comparators such as where `1 + 3` should match `2 + 2`, or where
     particular columns in the array can be omitted

  return arr.join();
}

function myFunction() {
  var source = [['Option 10', 2], ['Option 10', 2], ['Option 9', 1], ['Option 7', 1]];
  var hash = source.map(
    function (row) {
      return hash(row);
    }
  );

  source = source.filter(
    function (filterRow, i) {
      return hash.slice(0, i).indexOf(hash(filterRow)) < 0;
    }
  );

  Logger.log(source);
}

我只包括这个,因为有时您的比较可能需要稍微弯曲一下。在你的例子中,这并不重要,这就是为什么Serge是正确的,但我同意展示一个潜在的扩展思路,以便在需要进行独特的调整时 &#39;