所以,基本上我想要的是從二維陣列中獲取唯一資料,我可以在其中傳遞存盤在陣列中的多個列值。就像我想根據第 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]。
uj5u.com熱心網友回復:
解決方案:
- 使用過濾器從陣列中洗掉不需要的元素。
- 對于每一行,使用map獲取與要檢查的列相關的值的組合,以便如果存在具有此組合的另一行,則應過濾掉這兩行。
- 對于每一行,使用some檢查是否有另一行具有相同的組合。
- 使用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],正如預期的那樣。
uj5u.com熱心網友回復:
試試這個代碼:
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;
}
uj5u.com熱心網友回復:
以防萬一,這是我的代碼變體。它可以通過任何給定序列中的任意數量的列來過濾 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/493959.html
標籤:javascript 数组 谷歌应用脚本 谷歌表格 多维数组
下一篇:從谷歌表格中的單元格獲取特定字串
