从另一个元素中过滤一个二维数组
Filter a 2D Array From Elements of Another
我有两组数字元素存储为二维数组。这些值是使用 .getValues()
从列中获取的。一个是完整列表,另一个是部分列表。我想要一个 return 完整列表减去部分列表的函数。
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)
}
这是 return 的完整列表。
我也试过这个:
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)
}
它只会return部分结果。如果 fullListArr
有 943 而 partialListArr
有 288 个唯一值,我应该在 arr
中有 655 个值,但我得到 895 而不是 return 将它作为 2D数组。
这是一个 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)
这给了我 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;
}
谢谢 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)
这将按照您想要的方式进行过滤。简单地说,您的过滤器不起作用,因为您没有考虑返回的结果,即 [[]、[]、[]] 或数组数组。
所以在你的上下文中试试这个:
var arr = fullListArr.filter(item => !partialListArr.find(p ==> p[0] === item[0]);
我有两组数字元素存储为二维数组。这些值是使用 .getValues()
从列中获取的。一个是完整列表,另一个是部分列表。我想要一个 return 完整列表减去部分列表的函数。
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)
}
这是 return 的完整列表。
我也试过这个:
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)
}
它只会return部分结果。如果 fullListArr
有 943 而 partialListArr
有 288 个唯一值,我应该在 arr
中有 655 个值,但我得到 895 而不是 return 将它作为 2D数组。
这是一个 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)
这给了我 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;
}
谢谢 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)
这将按照您想要的方式进行过滤。简单地说,您的过滤器不起作用,因为您没有考虑返回的结果,即 [[]、[]、[]] 或数组数组。
所以在你的上下文中试试这个:
var arr = fullListArr.filter(item => !partialListArr.find(p ==> p[0] === item[0]);