Classifique uma matriz com base em outra matriz em javascript [duplicado]
Estas são minhas duas matrizes. Eu quero que sizeIdArray seja classificado com base em SizeNomeArray. Por exemplo,
sizeIdArray = [1, 2, 3];
sizeNameArray = [2.5m, 8m, 3.5m];
Depois de classificar o sizeNameArray,
sizeNameArray = [2.5m, 3.5m, 8m];
e
sizeIdArray should be [1, 3, 2];
Como faço para conseguir isso? Consegui obter o sizeNameArray por este método.
sizesNameArray.sort(function(a,b){return parseFloat(a.replace('#', ''))-parseFloat(b.replace('#', ''))})
a função de substituição é se houver '#' na frente.
Desculpe se minha pergunta não foi clara. Quero classificar os dois ao mesmo tempo, mas sizeIdArray deve ser classificado de acordo com sizeNameArray.
Por favor ajude. Obrigado
Respostas
sizeIdArray = [1, 2, 3];
sizeNameArray = ['2.5m', '8m', '3.5m'];
//1) combine the arrays:
var list = [];
for (var j = 0; j < sizeNameArray.length; j++)
list.push({'sizeId': sizeIdArray[j], 'sizeName': sizeNameArray[j]});
//2) sort:
list.sort(function(a, b) {
return ((a.sizeName.replace('#', '') < b.sizeName.replace('#', '')) ? -1
: ((a.sizeName.replace('#', '') == b.sizeName.replace('#', '')) ? 0 : 1));
//Sort could be modified too, for example sort on the id if the name is the same.
});
//3) separate them back out:
for (var k = 0; k < list.length; k++) {
sizeNameArray[k] = list[k].sizeName;
sizeIdArray[k] = list[k].sizeId;
}
console.log(sizeIdArray);
console.log(sizeNameArray);
Consulte Classifique duas matrizes da mesma maneira
Aqui está uma abordagem mais geral, sem necessidade de qualquer análise.
sizeIdArray = [1, 2, 3];
sizeNameArray = ['2.5m', '8m', '3.5m'];
var m = {}
for(let i in sizeNameArray){
m[sizeNameArray[i]] = sizeIdArray[i]
}
Object.keys(m).sort().forEach((item,index)=>sizeIdArray[index] = m[item])
console.log(sizeIdArray)
Esta não é a solução perfeita, mas se a complexidade do tempo não for uma preocupação, você pode usar este algoritmo. Ele está classificando-o manualmente, encontrando o menor número em cada iteração e trocando-o. Mas, ao trocar o, sizeNameArrayvocê também troca o sizeIdArraye, portanto, obterá o resultado necessário. Para torná-lo mais otimizado, você pode consultar este Sort an Array baseado em outro Array
sizeIdArray = [1, 2, 3];
sizeNameArray = [2.5, 8, 3.5];
for(let i = 0; i < sizeNameArray.length; i++) {
let smallest = i;
for(let j = i; j < sizeNameArray.length; j++) {
if(sizeNameArray[j] < sizeNameArray[smallest])
smallest = j;
}
let temp = sizeNameArray[i];
sizeNameArray[i] = sizeNameArray[smallest];
sizeNameArray[smallest] = temp;
temp = sizeIdArray[i];
sizeIdArray[i] = sizeIdArray[smallest];
sizeIdArray[smallest] = temp;
}
console.log(sizeIdArray);
Eu fiz assim.
var done = false;
while (!done) {
done = true;
for (var i = 1; i < sizesNameArray.length; i += 1) {
if (parseFloat(sizesNameArray[i - 1].replace('#', '')) > parseFloat(sizesNameArray[i].replace('#', ''))) {
done = false;
var tmp = sizesNameArray[i - 1];
var tmp2 = sizeIdArray[i-1];
sizesNameArray[i - 1] = sizesNameArray[i];
sizeIdArray[i - 1] = sizeIdArray[i];
sizesNameArray[i] = tmp;
sizeIdArray[i] = tmp2;
}
}
}