【问题标题】:Filtering a two dimensional array in apps script在应用程序脚本中过滤二维数组
【发布时间】:2018-06-23 18:47:18
【问题描述】:

在应用程序脚本中,我有以下内容:

function diff(A, B) {
  return A.filter(function (a) {
    return B.indexOf(a) == -1;
  });
}

当我跑步时:

function testArray(){

  ta = ['a','b','c','d']
  ts = ['a','b','c']

  o =diff(ta,ts)

  Logger.log(o);


}

我得到:['d'] - 正确答案,现在我正在尝试将过滤器应用于二维值数组 - 谷歌表。

我试过了:

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var target_sheet_range =   ss.getSheets()[1].getDataRange();
  var target_sheet_values =   target_sheet_range.getValues();
        Logger.log('target_sheet_values');
          Logger.log(target_sheet_values);
  var range = ss.getSheets()[0].getDataRange();
  var values = range.getValues();


          Logger.log('values');
          Logger.log(values);


    var diff_values = diff(values, target_sheet_values)

但这并没有考虑到数组的二维特性。你可以在谷歌电子表格https://docs.google.com/spreadsheets/d/1fFr9Sz2EAiMYoybg-evV33n_BZjF-1QNnnKqiqSXQ_g/edit?usp=sharing看到它

输出:

[18-06-23 14:45:22:129 EDT] target_sheet_values
[18-06-23 14:45:22:130 EDT] [[a, a, a, a, a], [z, x, c, v, b], [m, n, b, v, c]]
[18-06-23 14:45:22:457 EDT] values
[18-06-23 14:45:22:458 EDT] [[a, a, a, a, a], [z, x, c, v, b], [m, n, b, v, c], [a, s, d, f, g], [q, w, e, r, t]]
[18-06-23 14:45:22:459 EDT] hhhhhh
[18-06-23 14:45:22:459 EDT] [[a, a, a, a, a], [z, x, c, v, b], [m, n, b, v, c], [a, s, d, f, g], [q, w, e, r, t]]

如何修改过滤函数2过滤一个二维数组

【问题讨论】:

标签: javascript arrays multidimensional-array google-apps-script


【解决方案1】:

您的问题与 javascript [1, 2, 3] != [1, 2, 3] 中的事实有关。数组和对象的比较不是由值完成的。这也适用于indexOf()。例如:

var a = [[1, 2, 3], [4, 5, 6]]
var b = [4, 5, 6]

console.log(a.indexOf(b)) // returns -1

要解决此问题,您需要编写一个以您想要的方式定义相等性的函数。例如:

// arrays with the same values in the same order will be considered equal
function array_equals(a, b){
    return a.length === b.length && a.every((item,idx) => item === b[idx])
}

console.log(array_equals([1, 2, 3], [1, 2, 3]))
console.log(array_equals([1, 2, 3], [1, 2, 4]))

有了它,您现在可以使用以下内容进行过滤:

var a = [[1,2,3], [4, 5, 6], [7, 8, 9]]
var b = [[1, 2, 3], [4, 5, 6]]


function array_equals(a, b){
    return a.length === b.length && a.every((item,idx) => item === b[idx])
}

function diff(A, B) {
    return A.filter(test => {
      return B.findIndex(item => array_equals(item,test)) == -1;
    });
  }
console.log(diff(a,b))

【讨论】:

【解决方案2】:

您想从[[a, a, a, a, a], [z, x, c, v, b], [m, n, b, v, c], [a, s, d, f, g], [q, w, e, r, t]][[a, a, a, a, a], [z, x, c, v, b], [m, n, b, v, c]] 中检索[[a, s, d, f, g], [q, w, e, r, t]]。如果我的理解是正确的,那么这个示例脚本怎么样?我认为您的情况有几个答案。请将此视为其中之一。

示例脚本:

var res = values.filter(
   function(e) {
      return target_sheet_values.filter(
         function(f) {
            return e.toString() == f.toString()
         }).length == 0
   });

var target_sheet_values = [
   ["a","a","a","a","a"],
   ["z","x","c","v","b"],
   ["m","n","b","v","c"]
];
var values = [
   ["a","a","a","a","a"],
   ["z","x","c","v","b"],
   ["m","n","b","v","c"],
   ["a","s","d","f","g"],
   ["q","w","e","r","t"]
];

var res = values.filter(
   function(e) {
      return target_sheet_values.filter(
         function(f) {
            return e.toString() == f.toString()
         }).length == 0
   });
console.log(res);

结果

[["a","s","d","f","g"],["q","w","e","r","t"]]

注意:

  • valuestarget_sheet_values 来自您的脚本。
  • 当您使用它时,请在您的脚本中使用它而不是 var diff_values = diff(values, target_sheet_values)

如果我误解了你想要什么,请告诉我。我想修改它。

【讨论】:

  • @user61629 很高兴您的问题得到解决。也谢谢你。
猜你喜欢
  • 2013-06-23
  • 2020-04-10
  • 1970-01-01
  • 2011-05-24
  • 2012-05-14
  • 2018-12-28
  • 2019-09-04
  • 1970-01-01
相关资源
最近更新 更多