Classifique uma matriz com base em outra matriz em javascript [duplicado]

Aug 29 2020

Estas são minhas duas matrizes. Eu quero que sizeIdArray seja classificado com base em SizeNomeArray. Por exemplo,

sizeIdArray = [1, 2, 3];
sizeNameArray = [2.5m, 8m, 3.5m];

Depois de classificar o sizeNameArray,

sizeNameArray = [2.5m, 3.5m, 8m];

e

sizeIdArray should be [1, 3, 2];

Como faço para conseguir isso? Consegui obter o sizeNameArray por este método.

sizesNameArray.sort(function(a,b){return parseFloat(a.replace('#', ''))-parseFloat(b.replace('#', ''))})

a função de substituição é se houver '#' na frente.

Desculpe se minha pergunta não foi clara. Quero classificar os dois ao mesmo tempo, mas sizeIdArray deve ser classificado de acordo com sizeNameArray.

Por favor ajude. Obrigado

Respostas

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

Consulte Classifique duas matrizes da mesma maneira

1 ShivaSai Aug 29 2020 at 07:52

Aqui está uma abordagem mais geral, sem necessidade de qualquer análise.

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

Esta não é a solução perfeita, mas se a complexidade do tempo não for uma preocupação, você pode usar este algoritmo. Ele está classificando-o manualmente, encontrando o menor número em cada iteração e trocando-o. Mas, ao trocar o, sizeNameArrayvocê também troca o sizeIdArraye, portanto, obterá o resultado necessário. Para torná-lo mais otimizado, você pode consultar este Sort an Array baseado em outro 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

Eu fiz assim.

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