使用Google Apps Script和JavaScript从电子表格中获取基于多列的唯一值 &g



所以,基本上我想要的是从一个2d数组中获得唯一的数据,我可以通过多个列值,我已经存储在一个数组中。比如我想根据列1和列2获得唯一的,所以,我可以像数组[0,1]一样将列值传递给函数,根据列数组,它应该返回唯一的值。

我试过这样做:

function sortFunction(a, b) {
if (a[0] === b[0]) {  // 0 for column one
return 0;
}
else {
return (a[0] < b[0]) ? -1 : 1;
}
}
function getUniqueData_(arr) {
arr = arr.sort(sortFunction)
let prevEl;
const newArr = arr.reduce((prevArr, currentVal) => {
const idx = prevArr.findIndex(val => val[0] === currentVal[0]);
if (idx === -1) {
if (prevEl && prevEl[0] !== currentVal[0]) {
prevArr.push(currentVal);
}
} else {
prevArr.splice(idx, 1);
}
prevEl = currentVal;
return prevArr;
}, [])
console.log(newArr);
return newArr;
}

不是手动传递列值,我想动态地传递它,同时传递多个列,我已经将它存储在数组中,如列1和2的[0,1]。

解决方案:

  • 使用过滤器从你的数组中删除不需要的元素。
  • 对于每一行,使用map获取与您想要检查的列相关的值组合,因此,如果另一行存在此组合,则应过滤掉这两行。
  • 对于每一行,使用一些来检查是否有另一行具有相同的组合。
  • 使用every来比较两个组合并检查它们是否相同。

代码示例:

function getUniqueData(arr = [[1, 2, 3],[1, 2, 2],[1, 2, 3],[2, 1, 3]], uniqueCols = [0]) {
const uniqueData = arr.filter((currentRow,i) => {
const currentCombo = uniqueCols.map(index => currentRow[index]);
return !arr.some((row,j) => {
const combo = uniqueCols.map(index => row[index]);
return combo.every((c1,k) => c1 === currentCombo[k]) && i !== j;
});
});
return uniqueData;
}

注意:

在上面的示例中,我添加了您在注释data = [[1, 2, 3],[1, 2, 2],[1, 2, 3],[2, 1, 3]] and I want to check unique in column 1中提供的示例作为默认参数。在本例中,返回的uniqueData[2, 1, 3],与预期一致。

试试这个代码:

function sortData(){
//change data and column index according to requirements
var columns = [0,2] //0 for column 1
var data = [[1,2,3],[1,2,2],[1,2,3]]
var temp_arr = [];
var unique_arr = []; // for output
var specific_columns_data = getSpecificColumnsData(data, columns) // this function return array according to columns. eg [[1,3],[1,2],[1,3]]

for(var i=0;i<specific_columns_data.length;i++){
if(specific_columns_data[i].join("")!==""){

if(temp_arr.indexOf(specific_columns_data[i].join(""))==-1){
unique_arr.push(data[i]);
}
temp_arr.push(specific_columns_data[i].join(""))
}
}
Logger.log(unique_arr)
}
function getSpecificColumnsData(data, columns){
var specific_columns_data = []
var temp_arr = []
for(var i=0;i<data.length;i++){
temp_arr = []
for(var j = 0;j<columns.length;j++){
if(data[i][j]){
temp_arr.push(data[i][columns[j]])
}
}
specific_columns_data.push([temp_arr])
}
return specific_columns_data;
}

以防万一,这里是我的代码变体。它可以根据任意给定序列中的任意列数过滤2D数组:

var data = [
[1, 2, 3, 4],
[1, 2, 2, 4],
[2, 1, 3, 4],
[3, 1, 2, 4],
[4, 3, 3, 4],
[5, 2, 5, 1],
] 
function getUniqueData(data, columns) {
let arr = data.slice();
columns.forEach(c => {
let col = arr.map(x => x[c]);
arr = arr.filter(x => col.indexOf(x[c]) == col.lastIndexOf(x[c]));
});

return arr;
}
// get unique rows by column 1
console.log(getUniqueData(data, [0]));
// get unique rows by column 1 and then by column 2
console.log(getUniqueData(data, [0,1]));
// get unique rows by column 1 and then by column 3
console.log(getUniqueData(data, [0,2]));
// get unique rows by column 1 and then by column 4
console.log(getUniqueData(data, [0,3]));
// get unique rows by column 3
console.log(getUniqueData(data, [2]));
// get unique rows by column 4
console.log(getUniqueData(data, [3]));
// get unique rows by column 2, then by column 3, then by column 4
console.log(getUniqueData(data, [1,2,3]));
// etc

相关内容

  • 没有找到相关文章

最新更新