Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

289
Visualizações
Verifique si el objeto tiene solo las claves dadas usando Lodash o Underscore

¿Existe un método Lodash o Underscore que pueda encontrar si un objeto tiene solo las claves dadas de ese objeto? Me gustaría una implementación de Lodash o Underscore aunque esto suene trivial usando JS nativo.

Por ejemplo, si mi objeto se parece y suponiendo que hay un método lodash llamado hasOnly

 const obj = { name: undefined, age: 15, school: 'Some school' } _.hasOnly(obj,['name','age']) //return false _.hasOnly(obj,['name','age','city']) //return false _.hasOnly(obj,['name','age','school']) //return true

Parece que no pude encontrar una manera en los documentos

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Rápido y sucio:

 hasOnly = (obj, props) => _.isEqual(_.keys(obj).sort(), props.sort())

La clasificación se realiza porque estamos comparando matrices.

Como alternativa, uno podría convertir props y _.keys(obj) en objetos donde props y _.keys(obj) son las claves, mientras que el valor es ficticio, siempre el mismo, como 1 . La función para hacerlo podría ser algo como esto:

 make1ValuedObj = keys => _.zipObject(keys, Array(keys.length).fill(1))

Entonces uno los pasaría a _.isEqual sin tener que ordenar nada:

 hasOnly = (obj, props) => _.isEqual(make1ValuedObj(_.keys(obj)), make1ValuedObj(props))

La realidad es que tiene que ocurrir una especie de "clasificación" cuando construyes los objetos, por lo que no creo que haya una ventaja real sobre la solución anterior.

about 4 years ago · Juan Pablo Isaza Relatório

0

La solución nativa será más rápida en casi todos los casos:

 const obj = { name: undefined, age: 15, school: 'Some school' } const hasOnly = (obj,props) => { var objProps = Object.keys(obj) return objProps.length == props.length && props.every(p => objProps.includes(p)) } console.log(hasOnly(obj,['name','age'])) //return false console.log(hasOnly(obj,['name','age','city'])) //return false console.log(hasOnly(obj,['name','age','school'])) //return true

Comparar esto con la otra respuesta usando lodash muestra que la solución lodash es un 95% más lenta (en mi máquina)

Puntos de referencia: https://jsbench.me/r9kz2mwr9c/1

about 4 years ago · Juan Pablo Isaza Relatório

0

Creo que la respuesta de Enlico está bien, pero para completar mencionaré otra opción que no requiere clasificación. Esto se basa en comparar objetos directamente en lugar de comparar matrices de claves.

Tenga en cuenta que el siguiente código asume el guión bajo original. Para Lodash, reemplace _.mapObject por _.mapValues .

 // replace all properties by true to prevent costly recursion const mask = obj => _.mapObject(obj, _.constant(true)); function hasOnly(obj, keys) { const masked = mask(obj); // compare obj to a trimmed version of itself return _.isEqual(masked, _.pick(masked, keys)); }
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda