Mengurutkan sebuah array berdasarkan array lain dalam javascript [duplikat]
Ini adalah dua array saya. Saya ingin sizeIdArray diurutkan berdasarkan sizeNameArray. Sebagai contoh,
sizeIdArray = [1, 2, 3];
sizeNameArray = [2.5m, 8m, 3.5m];
Setelah mengurutkan sizeNameArray,
sizeNameArray = [2.5m, 3.5m, 8m];
dan
sizeIdArray should be [1, 3, 2];
Bagaimana saya mencapai ini? Saya bisa mendapatkan sizeNameArray dengan metode ini.
sizesNameArray.sort(function(a,b){return parseFloat(a.replace('#', ''))-parseFloat(b.replace('#', ''))})
fungsi ganti jika ada '#' di depan.
Maaf jika saya tidak jelas dengan pertanyaan saya. Saya ingin mengurutkan keduanya pada saat yang sama, tetapi sizeIdArray harus diurutkan menurut sizeNameArray.
Tolong bantu. Terima kasih
Jawaban
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);
Lihat Mengurutkan dua larik dengan cara yang sama
Berikut pendekatan yang lebih umum, tidak perlu parsefloat apapun.
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)
Ini bukanlah solusi yang tepat tetapi jika kerumitan waktu tidak menjadi perhatian, Anda dapat menggunakan algoritma ini. Ini menyortirnya secara manual dengan menemukan angka terkecil di setiap iterasi dan menukarnya. Tetapi, ketika Anda menukar, sizeNameArrayAnda juga menukar sizeIdArraydan karenanya Anda akan mendapatkan hasil yang dibutuhkan. Agar lebih optimal kamu bisa merujuk ke Sort an Array based on Another Array ini
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);
Saya melakukannya seperti ini.
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;
}
}
}