2
respostas

Retornando false

O meu programa está retornando isso:

[
  { titulo: 'PHP', preco: 15 },
  { titulo: 'Python', preco: 20 },
  { titulo: 'Rust', preco: 22 },
  { titulo: 'JavaScript', preco: 25 },
  false,
  false,
  false,
  { titulo: 'Java', preco: 30 },
  { titulo: 'C++', preco: 35 },
  { titulo: 'Go', preco: 45 }
]

Aí o meu código:

const bookList = require('./array.js');

function mergeSort (array) {

  if(array.length > 1) {
    const meio = Math.floor(array.length / 2);
    const parte1 = mergeSort(array.slice(0, meio));
    const parte2 = mergeSort(array.slice(meio, array.length));
    array = ordena(parte1, parte2);
  }
  return array;
}

function ordena(parte1, parte2) {
  let posicaoAtualParte1 = 0;
  let posicaoAtualParte2 = 0;
  const resultado = [];

  while(posicaoAtualParte1 < parte1.length && posicaoAtualParte2 < parte2.length) {

    let produtoAtualParte1 = parte1[posicaoAtualParte1];
    let produtoAtualParte2 = parte2[posicaoAtualParte2];

    if(produtoAtualParte1.preco < produtoAtualParte2.preco) {
      //console.log(produtoAtualParte1);
      resultado.push(produtoAtualParte1);
      posicaoAtualParte1 += 1;
    } else {
      //console.log(produtoAtualParte2);
      resultado.push(produtoAtualParte2);
      posicaoAtualParte2 += 1;
    }
  }

  return resultado.concat(posicaoAtualParte1 < parte1.length ? parte1.slice(posicaoAtualParte1)
  : posicaoAtualParte2 < parte2.slice(posicaoAtualParte2));
}

console.log(mergeSort(bookList));

Código da lista de livros:

const listaLivros = [
  { titulo: "Go", preco: 45 },
  { titulo: "C++", preco: 35 },
  { titulo: "Java", preco: 30 },
  { titulo: "PHP", preco: 15 },
  { titulo: "Elixir", preco: 50 },
  { titulo: "Rust", preco: 22 },
  { titulo: "Scala", preco: 40 },
  { titulo: "Ruby", preco: 28 },
  { titulo: "JavaScript", preco: 25 },
  { titulo: "C#", preco: 33 },
  { titulo: "Python", preco: 20 },
]

Já olhei todo o código varias vezes e não encontrei o erro... Alguém pode me ajudar??

2 respostas

Opa Rafael, cara o problema está na seguinte parte:

return resultado.concat(
    posicaoAtualParte1 < parte1.length 
    ? parte1.slice(posicaoAtualParte1)
    : posicaoAtualParte2 < parte2.slice(posicaoAtualParte2));

No contat você está fazendo uma condicional verificando

posicaoAtualParte1 < parte1.length 

caso true então é retornado

parte1.slice(posicaoAtualParte1) 

Entretanto caso isso seja false você está realizando uma nova condição que é

posicaoAtualParte2 < parte2.slice(posicaoAtualParte2))

nesse caso você pode alterar e deixar da seguinte forma:

return resultado.concat(
    posicaoAtualParte1 < parte1.length 
    ? parte1.slice(posicaoAtualParte1)
    : parte2.slice(posicaoAtualParte2));

Assim seu código vai retornar o que é esperado:

array com os livros ordenados pelo preço exibindo as propriedades de titulo e preço

Pô valeu Lucas Andrade de Lima, muito obrigado!!

Não tinha reparado nisso...

Desculpa a demora para responder, fiquei um pouco atarefado aqui e só consegui responde hoje...