Encontrar no objeto valores iguais

Tenho o seguinte objeto:

    var parcelas_financiamento = {
        "1": 821.39,
        "2": 821.39,
        "3": 821.39,
        "4": 5187.66,
        "5": 821.39,
        "6": 821.39,
        "7": 821.39,
        "8": 821.39,
        "9": 821.39,
        "10": 5187.66,
}

Que boa prática deveria implementar para encontrar que existem 2 parcelas iguais de 5187,66 e saber a que parcela corresponde (que seria parcela 4 e 10)?

Você pode usar o Object.keys() para pegar todas as chaves do seu objeto, e então usar o array gerado para filtrar os valores.

Mais ou menos assim:

const parcelas = {
        "1": 821.39,
        "2": 821.39,
        "3": 821.39,
        "4": 5187.66,
        "5": 821.39,
        "6": 821.39,
        "7": 821.39,
        "8": 821.39,
        "9": 821.39,
        "10": 5187.66,
}

const filter = (object, predicate) => Object.keys(object)
        .filter(key => predicate(object[key]))
        .reduce((acc, key) => {
            acc[key] = object[key];
            return acc;
        }, {});

console.log(filter(parcelas, value => value === 5187.66));
// => { '4': 5187.66, '10': 5187.66 }

O problema é que não sei o valor das parcelas que são iguais…no exemplo que te dei sabemos porque tive que exemplificar. Mas esse valores são dinâmicos. Além disso, precisaria saber quantas vezes se repete as parcelas de 821.39 (como comentei anteriormente os valores dessas parcelas são dinâmicos).

A resposta que precisaria chegar seria:

São 8 parcelas de 821,39 e 2 parcelas de 5187,66, nos meses 4 e 10.

Nesse caso você tem que agrupar por valor. E para cada valor, criar um array de meses:

const parcelas_financiamento = {
    "1": 821.39,
    "2": 821.39,
    "3": 821.39,
    "4": 5187.66,
    "5": 821.39,
    "6": 821.39,
    "7": 821.39,
    "8": 821.39,
    "9": 821.39,
    "10": 5187.66,
}

const result = {};
for (const [mes, valor] of Object.entries(parcelas_financiamento)) {
    // para cada valor, cria um array contendo os meses
    if (! result[valor])
        result[valor] = [];
    result[valor].push(mes);
}

//------------------ Mostrar os valores e respectivos meses
// NumberFormat é só pra mostrar o valor formatado como moeda (opcional, claro, depende do que você quer)
const formato = new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }); // supondo valores em reais
for (const [valor, meses] of Object.entries(result)) {
    console.log(`${meses.length} parcelas de ${formato.format(valor)} nos meses: ${meses.join(", ")}`);
}
1 curtida

Neste caso o ESLint não recomenda a utilização do for - of.

iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations.

Ué, é só trocar por um for tradicional:

const parcelas_financiamento = {
    "1": 821.39,
    "2": 821.39,
    "3": 821.39,
    "4": 5187.66,
    "5": 821.39,
    "6": 821.39,
    "7": 821.39,
    "8": 821.39,
    "9": 821.39,
    "10": 5187.66,
}

const result = {};
var entries = Object.entries(parcelas_financiamento);
for (var i = 0; i < entries.length; i++) {
    // para cada valor, cria um array contendo os meses
    const mes = entries[i][0];
    const valor = entries[i][1];
    if (! result[valor])
        result[valor] = [];
    result[valor].push(mes);
}

//------------------ Mostrar os valores e respectivos meses
// NumberFormat é só pra mostrar o valor formatado como moeda (opcional, claro, depende do que você quer)
const formato = new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }); // supondo valores em reais

entries = Object.entries(result);
for (var i = 0; i < entries.length; i++) {
    var valor = entries[i][0];
    var meses = entries[i][1];
    console.log(`${meses.length} parcelas de ${formato.format(valor)} nos meses: ${meses.join(", ")}`);
}

De qualquer forma, eu revisaria essa regra do eslint, pois for...ofpossui um bom suporte dos browsers atuais - claro que tem que ver caso a caso, mas enfim…

1 curtida