Eu tenho esse tipo de matriz:
var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
Eu gostaria de filtrá-lo para ter:
var bar = [ { "a" : "1" }, { "b" : "2" }];
Eu tentei usar _.uniq, mas acho que porque { "a" : "1" }
não é igual a si mesmo, não funciona. Existe alguma maneira de fornecer ao sublinhado uniq uma função igual substituída?
javascript
json
underscore.js
mais-
fonte
fonte
{ "a" : "2" }
existem? Em caso afirmativo, é esse o atributo ou o valor que o torna único?Respostas:
.uniq / .unique aceita um retorno de chamada
Notas:
Outro exemplo: usando o retorno de chamada para extrair marcas de carros, cores de uma lista
fonte
false
não é necessário para_.uniq()
. Também no lodash, você poderia ter escrito assim_.uniq(a, 'a');
, pois ele arranca a propriedadea
dos objetos._.uniq(a, false, 'a')
) Eu executei ping no github / bestiejs / lodash e eles disseram que o problema foi corrigido. Portanto, se você não estiver usando uma função, verifique se possui as últimas. Isso pode não ser um problema para o sublinhado.Se você deseja remover duplicatas com base em um ID, pode fazer algo assim:
fonte
Date
. No entanto, isso faz.Implementação da resposta da Shiplu.
fonte
JSON.parse(x[0]).a
porque x não é uma matriz de objetos, é uma matriz de seqüências de caracteres. Além disso, se você adicionar valores b aos únicos e inverter a ordem de a / b, eles não serão mais considerados exclusivos por sua função. (por exemplo, "" {\ "a \": \ "1 \", \ "b \": 2} "! =" {\ "b \": 2, \ "a \": \ "1 \"} ") Talvez esteja faltando alguma coisa, mas o resultado não deveria ser pelo menos útil? Aqui está um jsbin para ilustrar jsbin.com/utoruz/2/edit #a
de cada objeto, quando pode haver objetos duplicados que não contêm a chavea
. No entanto, faria sentido sea
fosse um ID exclusivo.(a ==(=) b when a = b = {a:1})
. O ponto da minha resposta foi o iterador. Tentei responder sem me preocupar com o motivo, o que poderia ser qualquer coisa, certo? (por exemplo, talvez eles quisessem extrair uma lista de marcas e cores de uma lista de carros em um show. jsbin.com/evodub/2/edit ) Felicidades!iterator
Quando tenho um ID de atributo, esta é a minha maneira preferida em sublinhado:
fonte
Usando sublinhado lib exclusivo a seguir está funcionando para mim, eu estou tornando a lista exclusiva com base em _id e retornando o valor String de _id:
fonte
Aqui está uma solução simples, que usa uma comparação profunda de objetos para verificar se há duplicatas (sem recorrer à conversão para JSON, que é ineficiente e hacky)
Ele filtra todos os elementos se eles tiverem uma duplicata posteriormente na matriz - de modo que o último elemento duplicado seja mantido.
Os testes para usos duplicados
_.isEqual
que executam uma comparação profunda otimizada entre os dois objetos, consulte a documentação isEqual de sublinhado para obter mais informações.edit: atualizado para usar,
_.filter
que é uma abordagem mais limpafonte
Os documentos do lodash 4.6.1 têm isso como exemplo de igualdade de chave de objeto:
_.uniqWith(objects, _.isEqual);
https://lodash.com/docs#uniqWith
fonte
Experimente a função do iterador
Por exemplo, você pode retornar o primeiro elemento
fonte
_.uniq(x,function(i){ return i[0]; });
aqui está a minha solução (coffeescript):
exemplo:
fonte
com sublinhado, tive que usar String () na função iteratee
fonte
Eu queria resolver essa solução simples de maneira direta, com um pouco de esforço computacional ... mas não é uma solução trivial com uma definição mínima de variável, é?
fonte
Vamos quebrar isso. Primeiro, vamos agrupar os itens da matriz pelo seu valor estrito
grouped
parece:Então vamos pegar o primeiro elemento de cada grupo
bar
parece:[ { "a" : "1" }, { "b" : "2" } ]
Coloque tudo junto:
fonte
Você pode fazer isso de forma abreviada como:
_.uniq(foo, 'a')
fonte