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

201
Visualizações
Lodash: elimine una propiedad para cada elemento en la matriz sin especificar el índice

Estoy construyendo un componente que me permite comparar dos objetos. Acepta una lista de campos para comparar y una lista de campos que deben ignorarse en formato de cadena

Aquí hay un ejemplo del objeto que se comparará:

 { // (..... More elements above .....) taskData: { "uniqueId": "OrdenTrabajo48", "id": 48, "position": 1, "name": "Dirección Obra Civil", "description": "Dirección Obra Civil Afecta: Sorda, Roberto", "startDate": "2021-10-16T11:00:00.000Z", "endDate": "2022-06-01T11:00:00.000Z", "duration": 227, "progress": 73, "hours": 0, "realHours": 15, "predecessor": null, "child": [], "resourceInfo": [ { "uniqueId": "Persona_1MJ0VE9G0", "id": "OrdenTrabajo48Persona_1MJ0VE9G0", "name": "Sorda, Roberto", "group": "Subgerencia de Planes y Proyectos - SUB_PLAN_PROY_SIT", "unit": 4.1667, "startDate": "2021-10-16T03:00:00.000+00:00", "endDate": "2022-06-01T02:59:59.000+00:00", "hours": 0, "realHours": 15, "avatar": "http://localhost:8091/images/llama.jpg" } ], "comments": null, "etiquetas": [], "baseLineStartDate": null, "baseLineEndDate": null } // (..... More elements below .....) }

(Pero para aclarar, podría ser cualquier objeto. El componente es abstracto y se puede usar en cualquier lugar)

El componente no conoce la estructura del objeto a comparar, solo el objeto y las rutas en formato de cadena

Quiero eliminar en cada elemento de la matriz resourceInfo , las propiedades avatar , icon , label y color independientemente de la longitud de la matriz, pero no sé si hay una sintaxis para hacerlo.

También quiero eliminar la propiedad realHours

Esto es lo que probé:

 const ignoredFields = [ 'taskData.resourceInfo[?].avatar', //<--- It's not working 'taskData.resourceInfo[].icon', //<--- Neither this 'taskData.resourceInfo.label', //<--- Or this 'taskData.resourceInfo[0].color', //<--- This hardcode is working, but I don't know the length in that scope 'taskData.realHours' // <-- No problems here ]; const currentComparableObject = _.omit(obj, ignoredFields); const oldComparableObject = _.omit(prev, ignoredFields);
about 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

var fieldsToOmit=[]; var resourceInfoFields=['avatar','icon','label','color']; var globalFields=['realHours']; taskData.resourceInfo.forEach((item,index)=>{ resourceInfoFields.forEach((field)=>{ fieldsToOmit.push(`resourceInfo[${index}].${field}`) }) }) console.log( _.omit(taskData, fieldsToOmit.concat(globalFields)))
about 4 years ago · Santiago Trujillo Relatório

0

Puede eliminar propiedades de manera funcional (inmutable) mediante la desestructuración:

 const {realHours, ...result} = { ...taskData, resourceInfo: taskData.resourceInfo.map( ({avatar, icon, label, color, ...keep}) => keep ) }; console.log(result);
about 4 years ago · Santiago Trujillo Relatório

0

Gracias por las respuestas a todos.

Para resolver parcialmente el problema, creé una función que hace lo siguiente:

  • Filtra las referencias que contienen [?] (es decir: taskData.resourceInfo[?].avatar )

  • Luego obtenga la primera parte de la cadena (es decir, la ruta para llegar a la matriz) y la segunda parte (nombre de la propiedad)

  • Usando _.get de lodash, recupera la longitud de la matriz y crea una nueva referencia de campo con el índice, para que loadash pueda leerlo.

 private sanitizeArrays(obj: any, fieldReferences: string[]): string[] { const fieldsDup = [...fieldReferences]; // Get Elements that contains [?] in the property name const arrays = fieldsDup.filter(ignoredField => ignoredField.match(/\[\?]/g)); // Remove elements that contain [?] from ignoredFieldsDuplicated fieldsDup.forEach((ignoredField, index) => { if (ignoredField.includes('[?]')) { fieldsDup.splice(index, 1); } }); // Get the properties names without [?] const arrayPropertyName = arrays.map(ignoredField => ignoredField.split('[')[0]); const afterArrayPropertyName = arrays.map(ignoredField => ignoredField.split(']')[1]); // For each array that I have... arrayPropertyName.forEach((array, index) => { const length = _.get(obj, array).length; for (let i = 0; i < length; i++) { fieldsDup.push(array + '[' + i + ']' + afterArrayPropertyName[index]); } }); return fieldsDup; }

Entrada de ejemplo (si el objeto contiene solo un elemento en resourceInfo):

 'taskData.resourceInfo[?].avatar', 'taskData.resourceInfo[?].icon', 'taskData.resourceInfo[?].label', 'taskData.resourceInfo[?].color', 'taskData.resourceInfo[?].fontColor', 'taskData.realHours'

Salida de ejemplo:

 taskData.resourceInfo[?].icon taskData.resourceInfo[?].color taskData.realHours taskData.resourceInfo[0].avatar taskData.resourceInfo[0].icon taskData.resourceInfo[0].label taskData.resourceInfo[0].color taskData.resourceInfo[0].fontColor

(javascript includes() no funciona bien al eliminar el [?])

Además, no funciona para matrices anidadas ...

about 4 years ago · Santiago Trujillo 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