Como posso inserir uma matriz se nenhum valor existe? Aqui está minha matriz:
[
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" }
]
Se eu tentasse entrar novamente no array com um name: "tom"
ou outro text: "tasty"
, não quero que nada aconteça ... mas se nenhum deles estiver lá, quero que.push()
Como posso fazer isso?
javascript
arrays
json
push
not-exists
Tarnfeld
fonte
fonte
Respostas:
Você pode estender o protótipo Array com um método personalizado:
fonte
Array.findIndex()
é uma função JS interna que obterá o mesmo que seu código.Para uma matriz de seqüências de caracteres (mas não uma matriz de objetos), você pode verificar se um item existe chamando
.indexOf()
e se não existir , basta enviar o item para a matriz:fonte
if (a.indexOf({ name: "tom", text: "tasty" })!=-1) a.push({ name: "tom", text: "tasty" })
duas vezes. Ele adicionará um objeto 'semelhante' duas vezes.É bastante fácil usar a
Array.findIndex
função, que aceita uma função como argumento:fonte
http://api.jquery.com/jQuery.unique/
você também pode estar interessado em makeArray
O exemplo anterior é melhor dizer que verifique se existe antes de pressionar. Em retrospectiva, também afirma que você pode declará-lo como parte do protótipo (acho que é conhecido como Extensão de Classe), portanto, não há grande aprimoramento abaixo.
Exceto que não tenho certeza se indexOf é uma rota mais rápida que o inArray? provavelmente.
fonte
Note that this only works on arrays of DOM elements, not strings or numbers.
Além disso, o indexOf não funciona no IE8 :(Use uma biblioteca js como underscore.js por esses motivos exatamente. Uso: união: Calcula a união das matrizes passadas: a lista de itens exclusivos, em ordem, que estão presentes em uma ou mais matrizes.
fonte
Como isso?
Com objeto
fonte
array.find
é uma péssima ideia, porque pesquisa toda a matriz. UsefindIndex
, que pesquisa apenas até a primeira ocorrência.Sei que essa é uma pergunta muito antiga, mas se você estiver usando o ES6, poderá usar uma versão muito pequena:
Muito fácil, primeiro adicione um filtro que remova o item - se ele já existir, e adicione-o através de uma concat.
Aqui está um exemplo mais realista:
Se seu array contiver objetos, você poderá adaptar a função de filtro da seguinte forma:
fonte
Empurre dinamicamente
No método simples
Se a matriz contiver apenas tipos primitivos / matriz simples
fonte
Eu sugiro que você use um conjunto ,
Os conjuntos permitem apenas entradas exclusivas, que resolvem automaticamente o seu problema.
Os conjuntos podem ser declarados da seguinte forma:
fonte
Array.push
, entãoSet.add
é o equivalente a isso.Código fácil, se 'indexOf' retornar '-1' significa que o elemento não está dentro da matriz, e a condição '=== -1' recuperará verdadeiro / falso.
O operador '&&' significa 'e', portanto, se a primeira condição for verdadeira, enviamos para a matriz.
fonte
Não tenho certeza sobre velocidade, mas
stringification
+indexOf
é uma abordagem simples. Comece transformando sua matriz em uma string:Em seguida, para uma série de pares atributo-valor, você pode usar:
Encontrar um objeto inteiro é mais simples:
fonte
Caso você precise de algo simples sem querer estender o protótipo Array:
fonte
Caso alguém tenha requisitos menos complicados, eis a minha adaptação da resposta para uma matriz simples de strings:
Atualização: indexOf e aparagem substituídos por alternativas jQuery para compatibilidade com o IE8
fonte
Usei map e reduzi para fazer isso no caso em que você deseja pesquisar por uma propriedade específica de um objeto, útil como fazer a igualdade direta de objetos geralmente falhará.
fonte
Breve exemplo:
fonte
a é a matriz de objetos que você possui
fonte
Você pode usar o método findIndex com uma função de retorno de chamada e seu parâmetro "this".
Nota: navegadores antigos não conhecem o findIndex, mas um polyfill está disponível.
Código de amostra (lembre-se de que, na pergunta original, um novo objeto seja enviado apenas se nenhum dos seus dados estiver em objetos enviados anteriormente):
fonte
Eu acho que estou atrasado para responder aqui, no entanto, é isso que eu finalmente criei para um gerente de correio que escrevi. Funciona é tudo o que eu preciso.
fonte
Isso está funcionando func para uma comparação de objetos. Em alguns casos, você pode ter muitos campos para comparar. Basta fazer um loop na matriz e chamar essa função com itens existentes e novo item.
fonte
Aqui você tem uma maneira de fazer isso em uma linha para duas matrizes:
fonte
Você pode usar o jQuery grep e pressionar se não houver resultados: http://api.jquery.com/jQuery.grep/
É basicamente a mesma solução da solução "estendendo o protótipo", mas sem estender (ou poluir) o protótipo.
fonte
Você pode verificar a matriz usando foreach e, em seguida, exibir o item, se existir, caso contrário, adicione um novo item ...
exemplo newItemValue e submitFields são pares chave, valor
fonte