Como filtrar nomes duplicados de uma lista usando jquery?

Olá pessoal, Tenho um combo-box que contem uma lista do banco de dados e nessa lista existe alguns campos duplicados, exemplo na imagem a baixo:

image

Tenho que filtrar essa lista para não aparecer mais os itens duplicados, através do código com o jquery.

Eu tentei fazer dessa forma:

identar texto pré-formatado por 4 espaços
function listarEstabelecimentosParceiros() {
            var params = "{dc_tipo_parceiro:'" + 'RGA' + "',cd_estabelecimento_atividade:''}";
            $.ajax({
                type: "POST",
                url: "frmPlaquetaLote.aspx/ListarEstabelecimentosParceiros",
                async: false,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: params,
                success: function (msg) {
                    result = msg.d.Estabelecimento;
                    var html = '';
                    var count = msg.d.Count;
                    for (i = 0; i < count; i++) {
                        var labelCombo = result[i].propriedades.nm_fantasia;
                        var filtro = "";
                        $.each(labelCombo, function (i, el) {
                            if (el, filtro === -1) filtro.Push(el);

                            else if ($.trim(filtro).length == 0) {
                                filtro = result[i].propriedades.nr_cnpj_cpf;
                            }
                            html += '<option value="' + result[i].propriedades.cd_estabelecimento_atividade + '">' + filtro + '</option>';
                        });

                    }

                    $("#drop_con_par").append(html);
                    $("#drop_cad_par").append(html);
                },
                error: function () {
                    OpenDialogAtencao("Erro ao listar estabelecimentos.");
                }
            });
        }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<select id="drop_con_par" style="width: 250px;" req="true" title="Parceiro">
  <option value="0">SELECIONE </option>
  <option value="2891"> DROG DOG RIA</option>
  <option value="2892"> ILUMIDENTE ODONTOLOGIA EIRELI ME</option>
  <option value="2462">&nbsp;COBASI</option>
  <option value="2462">&nbsp;COBASI</option>
  <option value="2462">&nbsp;COBASI</option>
  <option value="267">1111</option>
  <option value="2057">249/COBASI COM PRODS BASICOS E IND LTDA</option>

</select>

Mas, ao invés de filtrar esta duplicando mais, se alguém poder me dar uma ajuda. Agradeço desde já.

Não é possível resolver essa duplicação na consulta no banco de dados? Além de possivelmente ser mais fácil no SQL, trafegariam menos dados entre servidor e cliente também.

De toda forma, há algumas abordagens possíveis. Numa busca rápida, achei esse exemplo usando reduce(). Ficaria algo como:

result = result.reduce((unique, o) => {
    if(!unique.some(obj => obj.cd_estabelecimento_atividade === o.cd_estabelecimento_atividade && obj.nr_cnpj_cpf === o.nr_cnpj_cpf)) {
      unique.push(o);
    }
    return unique;
},[]);

Isso antes do seu loop de renderização. Exemplo rodando no jsFiddle: https://jsfiddle.net/zb8p0v74/

Abraço.

1 curtida

Com 99.99% de certeza que está será a maneira correta de fazer

1 curtida

Valeu mesmo cara, também concordo que o melhor e fazendo pelo banco, mas não tenho acesso ao banco, sou estagiário me passaram a demanda mas não posso fazer alterações no banco.
Valeu mesmo pela ajuda.