Ordina un array sulla base di un altro array in javascript [duplicate]

Aug 29 2020

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

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

Fare riferimento a Ordina due array allo stesso modo

1 ShivaSai Aug 29 2020 at 07:52

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)

1 keidakida Aug 29 2020 at 07:52

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

ShahRukh Aug 29 2020 at 07:53

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