Mengurutkan sebuah array berdasarkan array lain dalam javascript [duplikat]

Aug 29 2020

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

1 mangesh Aug 29 2020 at 07:48

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

1 ShivaSai Aug 29 2020 at 07:52

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)

1 keidakida Aug 29 2020 at 07:52

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);

ShahRukh Aug 29 2020 at 07:53

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;
          }
        }
      }