代码之家  ›  专栏  ›  技术社区  ›  DanCue

从另一个元素中过滤二维数组

  •  1
  • DanCue  · 技术社区  · 6 年前

    .getValues() . 一个是完整列表,另一个是部分列表。我想要一个返回完整列表减去部分列表的函数。

    • 这个 partialListArr 可能包含重复项。这个 fullListArr
    • 我需要输出也是一个二维列表,因为它们将用于 .setValues() .
    • 值都是数字。

    function myFunction() {
      var ss = SpreadsheetApp.getActive();
      var partialListArr = ss.getSheetByName('sheet 2').getRange(1,1,357,1).getValues();
      var fullListArr = ss.getSheetByName('sheet 1').getRange(1,1,942,1).getValues();
    
      var arr = fullListArr.filter(function(item){
        return partialListArr.indexOf(item.id) === -1;
      }); 
    
      Logger.log(arr.length)
      Logger.log(arr)
    }
    

    这将返回完整列表。

    function myFunction2(){
      var ss = SpreadsheetApp.getActive();
      var partialListArr = ss.getSheetByName('sheet 2').getRange(1,1,357,1).getValues();
      var fullListArr = ss.getSheetByName('sheet 1').getRange(1,1,942,1).getValues();
    
      var arr = fullListArr.map(function(e){return e[0];})
        .filter(function(e,i,a){return (a.indexOf(e)==i && partialListArr.indexOf(e) ==-1); })  
    
      Logger.log(arr.length)
      Logger.log(arr)
    } 
    

    它将只返回部分结果。如果 完整列表 有943和 有288个唯一值,我应该有655个值 arr 但我得到了895,它并不是作为二维数组返回的。

    这是一个 sheet with a data set 这两个都包括在内。

    尝试: 首先,如果使用第一个函数,我需要展平。

      var ss = SpreadsheetApp.getActive();
      var partialListArr = ss.getSheetByName('sheet 2').getRange(1,1,357,1).getValues();
      var fullListArr = ss.getSheetByName('sheet 1').getRange(1,1,942,1).getValues();
    
      var flatPartialListArr = [].concat.apply([], partialListArr);
      var flatFullListArr = [].concat.apply([], fullListArr);
    
      var arr = flatFullListArr.filter(function(item){
        return flatPartialListArr.indexOf(item) === -1;
      }); 
    
      Logger.log(arr.length)
      Logger.log(arr)
    

    给了我正确的号码 . 下一步是把它变成一个二维数组,我再把它插进去 .setValues

    function myFunction() {
      var ss = SpreadsheetApp.getActive();
      var partialListArr = ss.getSheetByName('sheet 2').getRange(1,1,357,1).getValues();
      var fullListArr = ss.getSheetByName('sheet 1').getRange(1,1,942,1).getValues();
    
      var flatPartialListArr = [].concat.apply([], partialListArr);
      var flatFullListArr = [].concat.apply([], fullListArr);
    
      var flatArr = flatFullListArr.filter(function(item){
        return flatPartialListArr.indexOf(item) === -1;
      }); 
    
      //Convert to 2D again for input into .setValues
      var newArr = [];
      while(flatArr.length) newArr.push(flatArr.splice(0,1));
    
      Logger.log(newArr.length)
      Logger.log(newArr)
    
      return newArr;
    }
    

    谢谢你,阿克里安!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Akrion    6 年前

    你好像有这样的东西:

    var full = [[1],[2],[3],[4],[5]]
    var partial = [[3],[4]]
    
    var result = full.filter(x => !partial.find(p => p[0] === x[0]))
    console.log(result)

    因此,在您的上下文中,请尝试以下操作:

    var arr = fullListArr.filter(item => !partialListArr.find(p ==> p[0] === item[0]);