Quero classificar uma matriz 2D com uma matriz 1D no AppScript.
para que a matriz 2D fique na mesma ordem que a matriz 1D.
Aí está o link da planilha do Google:
Matriz 1D |
---|
um |
b |
c |
e |
e |
e |
g |
o |
eu |
eu |
o |
eu |
Matriz 2D | |
---|---|
b | 156 |
e | 68 |
um | 507 |
c | 22 |
e | 430 |
e | 555 |
g | 689 |
o | 62 |
eu | 395 |
eu | 209 |
eu | 745 |
o | 37 |
Eu uso o alfabeto como exemplo, mas no meu caso não é apenas a letra, mas o nome completo.
Tentei o script de outro post com o nome: "Classificar array de objetos por lista arbitrária em Javascript", mas não funciona, apenas me retorna meu array 2D sem classificá-lo.
o script que eu tento:
const objects = spreadsheetApp.getActive().getSheetByName("feuille 2").getRange('A;B').getValues()
const order = spreadsheetApp.getActive().getSheetByName("feuille 1").getRange('A;A').getValues()
const orderIndex = {}
order.forEach((value, index) => orderIndex[value] = index);
// Sort
objects.sort((a, b) => orderIndex[a.id] - orderIndex[b.id]);
// Log
console.log('orderIndex:', orderIndex);
console.log('objects:', objects);
Editar: Script que tentei com base na resposta, que não funcionou:
function myFunction() {
let objects = SpreadsheetApp.getActive().getSheetByName("Feuille 7").getRange('D:E').getValues()
let order = SpreadsheetApp.getActive().getSheetByName("Feuille 7").getRange('A:A').getValues().flat()
/* Create a mapping object `orderIndex`:
*/
let orderIndex = {}
order.forEach((value, index) => orderIndex[value] = index);
// Sort
objects.sort((a, b) => orderIndex[a] - orderIndex[b])
// Log
Logger.log("/////////////////////////order////////////////////////////////")
Logger.log(order)
Logger.log("/////////////////////////objects////////////////////////////////")
Logger.log(objects)
SpreadsheetApp.getActive().getSheetByName("Feuille 7").getRange('H:I').setValues(objects)
}
order
é uma matriz 2D.getValues()
sempre retorna uma matriz 2D, independentemente do tamanho do intervalo.flat
transforme-a em uma matriz 1D:Não há
id
atributo em arrays 2D. Remova-o e obtenha o primeiro índice de cada array interno e classifique com base nele:Também há um erro de digitação nas
getRange
chamadas: deveria serA:B
andA:A
(dois pontos:
- não ponto e vírgula;
)A questão pergunta como classificar
array
na ordem personalizada especificada pororder
. No caso geral, onde os dois arrays podem conter um número diferente de itens, isso é difícil de fazer com Array.sort() , porque esse método só permite que você compare itens entrearray
si. A questão, no entanto, especifica que os itens devem ser comparados e classificados de acordo comorder
, que é um array diferente.Uma maneira de classificar
array
na ordem personalizada especificada pororder
é usarArray.map()
, assim:Você pode usar a função assim:
Os resultados ficarão assim:
Observe como o posicionamento incomum de
f
,e
ed
se reflete no resultado.Veja Array.map() .