从另一个元素过滤2D阵列 [英] Filter a 2D Array From Elements of Another

查看:73
本文介绍了从另一个元素过滤2D阵列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两组数字元素存储为2D数组.使用.getValues()从一列中获取值.一个是完整列表,另一个是部分列表.我想要一个返回完整列表减去部分列表的函数.

I have two sets of numeric elements stored as 2D array. The values were grabbed from a column using .getValues(). One is a full list the other is a partial list. I want a function that returns full list minus partial list.

  • partialListArr可能包含重复项. fullListArr确实 不是.
  • 我需要输出也要是2D列表,因为它们将在.setValues()中使用.
  • 值都是数字.
  • The partialListArr may contain duplicates. The fullListArr does not.
  • I need the output to also be a 2D list as they will be used in .setValues().
  • Values are all numbers.

这是我尝试过的.

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)
} 

它将仅返回部分结果.如果fullListArr具有943个值,而partialListArr具有288个唯一值,则我应该在arr中具有655个值,但是我得到895个,并且它没有将其作为2D数组返回.

It will return only part of the results. If fullListArr has 943 and partialListArr has 288 unique values, I should have 655 values in arr but I'm getting 895 and it is not returning it as a 2D array.

这是一个包含数据集的表,并且都包括在内.

Here is a sheet with a data set and both of these included.

尝试:首先,如果使用第一个功能,则需要展平.

Attempts: First I need to flatten if using the first function.

  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)

那给了我arr的正确数字.下一步是再次将其制成2d数组,以将其插入.setValues中.这是带有完整解决方案的功能.

That gave me the correct number for arr. Next step is to make it a 2d array again for me to plug it in .setValues. Here is the function with the full solution.

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;
}

谢谢Akrion!

推荐答案

看来您有这样的事情:

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)

这将过滤您想要的方式.简单地说,您的过滤器不起作用,因为您没有考虑返回的结果,即[[],[],[]]或数组数组.

This will filter the way you want. Simply put your filter does not work since you did not take into account the result returned, which is [[], [], []] or array of arrays.

因此,请根据您的情况尝试以下操作:

So in your context try this:

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

这篇关于从另一个元素过滤2D阵列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆