Sortieren Sie ein Array anhand eines anderen Arrays in Javascript [Duplikat].
Das sind meine beiden Arrays. Ich möchte, dass sizeIdArray anhand von sizeNameArray sortiert wird. Zum Beispiel,
sizeIdArray = [1, 2, 3];
sizeNameArray = [2.5m, 8m, 3.5m];
Nach dem Sortieren von sizeNameArray
sizeNameArray = [2.5m, 3.5m, 8m];
und
sizeIdArray should be [1, 3, 2];
Wie erreiche ich das? Mit dieser Methode konnte ich das sizeNameArray erhalten.
sizesNameArray.sort(function(a,b){return parseFloat(a.replace('#', ''))-parseFloat(b.replace('#', ''))})
Die Ersetzungsfunktion ist, wenn vor '#' stand.
Entschuldigung, wenn mir meine Frage nicht klar ist. Ich möchte beide gleichzeitig sortieren, aber sizeIdArray sollte nach sizeNameArray sortiert werden.
Bitte helfen Sie. Dankeschön
Antworten
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);
Siehe Sortieren von zwei Arrays auf dieselbe Weise
Hier ist ein allgemeinerer Ansatz, der keinen Parsefloat erfordert.
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)
Dies ist nicht die perfekte Lösung, aber wenn die Komplexität der Zeit keine Rolle spielt, können Sie diesen Algorithmus verwenden. Es wird manuell sortiert, indem die kleinste Zahl in jeder Iteration gefunden und ausgetauscht wird. Aber wenn Sie das tauschen, tauschen sizeNameArraySie auch das sizeIdArrayund somit erhalten Sie das benötigte Ergebnis. Um es optimaler zu machen, können Sie auf dieses Sortieren eines Arrays basierend auf einem anderen Array verweisen
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);
Ich habe es so gemacht.
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;
}
}
}