Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Resultado = objeto vazio {}

Pessoal, podem me ajudar? O meu código está retornando um objeto vazio no resultado e não sei o que fazer.

ARQUIVO ARRAY.JS

const listaLivros = [
    { titulo: "JavaScript", preco: 20 },
    { titulo: "Python", preco: 15 },
    { titulo: "Java", preco: 30 },
    { titulo: "C++", preco: 25 },
    { titulo: "Ruby", preco: 10 },
    { titulo: "Go", preco: 35 }
];

ARQUIVO MERGESORT.JS

const listaLivros = require('./array');

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){
            resultado.push(produtoAtualParte1);
            posicaoAtualParte1++;
        } else {
            resultado.push(produtoAtualParte2);
            posicaoAtualParte2++;
        }
    }
}
console.log(mergeSort(listaLivros));

RESULTADO NO TERMINAL: Print Terminal VS Code

5 respostas

Eu acho que o problema é que a function ordena não está retornando valor.

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){
            resultado.push(produtoAtualParte1);
            posicaoAtualParte1++;
        } else {
            resultado.push(produtoAtualParte2);
            posicaoAtualParte2++;
        }
    }

    while (posicaoAtualParte1 < parte1.length) {
        resultado.push(parte1[posicaoAtualParte1]);
        posicaoAtualParte1++;
    }

    while (posicaoAtualParte2 < parte2.length) {
        resultado.push(parte2[posicaoAtualParte2]);
        posicaoAtualParte2++;
    }

    return resultado;
}

Verdade, Eryck. Obrigado, realmente a function ordena() estava sem return.

Mas agora está retornando valor, no entanto, esse valor é um objeto vazio {} . O mesmo problema:

Print Terminal VS Code

solução!

Mano, precisei abrir meu VSCode aqui para testar, coloquei a constante de livros no mesmo arquivo para conseguir ser mais ágil aqui:

const listaLivros = [
    { titulo: "JavaScript", preco: 20 },
    { titulo: "Python", preco: 15 },
    { titulo: "Java", preco: 30 },
    { titulo: "C++", preco: 25 },
    { titulo: "Ruby", preco: 10 },
    { titulo: "Go", preco: 35 }
];

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){
            resultado.push(produtoAtualParte1);
            posicaoAtualParte1++;
        } else {
            resultado.push(produtoAtualParte2);
            posicaoAtualParte2++;
        }
    }
    while (posicaoAtualParte1 < parte1.length) {
        resultado.push(parte1[posicaoAtualParte1]);
        posicaoAtualParte1++;
    }
    while (posicaoAtualParte2 < parte2.length) {
        resultado.push(parte2[posicaoAtualParte2]);
        posicaoAtualParte2++;
    }

    return resultado;
}

console.log(mergeSort(listaLivros));

Alterei um pouco a função mergeSort e a função ordena.

Na função mergeSort, a condição de parada da recursão foi alterada de array.length > 1 para array.length <= 1. Isso significa que a função mergeSort agora retorna o próprio array quando seu comprimento é 1 ou menos, o que é o comportamento esperado em um algoritmo de ordenação.

Na função ordena, foram adicionados dois loops while no final. Esses loops garantem que todos os elementos restantes nas partes 1 e 2 sejam adicionados ao array de resultado depois que um dos arrays foi completamente percorrido no loop while principal.

Aí no fim o console.log com a chamada da função.

O resultado aqui foi:

[
  { titulo: 'Ruby', preco: 10 },
  { titulo: 'Python', preco: 15 },
  { titulo: 'JavaScript', preco: 20 },
  { titulo: 'C++', preco: 25 },
  { titulo: 'Java', preco: 30 },
  { titulo: 'Go', preco: 35 }
]

Eryck, você é sensacional. Muito obrigado mesmo!!

Era exatamente isso, precisava ajustar o while na função ordena().

O código final ficou assim.

Obs. O curioso é que tive que colocar o array de objetos no mesmo arquivo também, assim como você explicou. Se eu tentasse chamar pelo require() dava o mesmo resultado vazio no console.log

const listaLivros = [
    { titulo: "JavaScript", preco: 20 },
    { titulo: "Python", preco: 15 },
    { titulo: "Java", preco: 30 },
    { titulo: "C++", preco: 25 },
    { titulo: "Ruby", preco: 10 },
    { titulo: "Go", preco: 35 }
];

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){
            resultado.push(produtoAtualParte1);
            posicaoAtualParte1++;
        } else {
            resultado.push(produtoAtualParte2);
            posicaoAtualParte2++;
        }
    }

    return resultado.concat(parte1.slice(posicaoAtualParte1)).concat(parte2.slice(posicaoAtualParte2));
}
console.log(mergeSort(listaLivros));

O retorno no terminal finalmente foi o esperado: Print terminal VS Code

Que maravilha, que bom que deu certo, feliz em ajudar.

Acho que sobre precisar colocar no mesmo arquivo é porque você não está exportando a listaLivros no arquivo Array.js.

Posso estar enganado, mas acho que precisa colocar no array.js:

module.exports = listaLivros;

Pois aí vai reconhecer o:

const listaLivros = require('./array');

No arquivo mergesort.js.