Ordina un array sulla base di un altro array in javascript [duplicate]
Questi sono i miei due array. Voglio che sizeIdArray venga ordinato in base a sizeNameArray. Per esempio,
sizeIdArray = [1, 2, 3];
sizeNameArray = [2.5m, 8m, 3.5m];
Dopo aver ordinato sizeNameArray,
sizeNameArray = [2.5m, 3.5m, 8m];
e
sizeIdArray should be [1, 3, 2];
Come ottengo questo? Sono stato in grado di ottenere sizeNameArray con questo metodo.
sizesNameArray.sort(function(a,b){return parseFloat(a.replace('#', ''))-parseFloat(b.replace('#', ''))})
sostituire la funzione è se ci fosse '#' davanti.
Scusa se non sono chiaro con la mia domanda. Voglio ordinare entrambi allo stesso tempo, ma sizeIdArray dovrebbe essere ordinato in base a sizeNameArray.
Per favore aiuto. Grazie
Risposte
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);
Fare riferimento a Ordina due array allo stesso modo
Ecco un approccio più generale, senza bisogno di alcun parsefloat.
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)
Questa non è la soluzione perfetta, ma se la complessità del tempo non è un problema, puoi utilizzare questo algoritmo. Lo sta ordinando manualmente trovando il numero più piccolo in ogni iterazione e scambiandolo. Ma quando si scambia il, sizeNameArraysi scambia anche il sizeIdArraye quindi si otterrà il risultato necessario. Per renderlo più ottimale puoi fare riferimento a questo Ordina un array basato su un altro 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);
L'ho fatto così.
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;
}
}
}