Estoy devolviendo nulo si una matriz de objetos tiene los mismos valores de propiedad y está bien con las propiedades directas del objeto. Estoy intentando con valores de propiedades de objetos anidados en la misma matriz, pero está fallando. A continuación se muestra el código para el mismo.
const getNullOrUniquePropertyValue = (arrToCheck, keyName, includeFullObject = null) => { const uniqueValues = [...new Set(arrToCheck.map((v) => v[keyName]))]; if (uniqueValues.size !== 1) { return null; } return includeFullObject ? arrToCheck[0].includeFullObject : arrToCheck[0].keyName; };
Y estoy llamando a la función anterior como se muestra a continuación
getNullOrUniquePropertyValue( spaces, 'designHubProjectSpaceTypeId' )
Obtengo resultados nulos para la función anterior porque designHubProjectSpaceTypeId no es el mismo en la matriz.
Estoy pasando la propiedad de objetos anidados como se muestra a continuación, y está devolviendo un valor nulo para la condición a continuación, incluso si la matriz tiene los mismos valores.
getNullOrUniquePropertyValue(spaces, 'spaceGeometry.ceilingHeight')
y la estructura espacial como esta como se muestra a continuación
"spaces": [ { "spaceGeometry": { "ceilingHeight": 9 }, "designHubProjectSpaceTypeId": "some Id" }, { "spaceGeometry": { "ceilingHeight": 9 }, "designHubProjectSpaceTypeId": "some other Id" } ]
¿Alguien podría decirme dónde estoy haciendo mal con el código anterior?
¡¡Muchas gracias de antemano!!
Algunos comentarios:
v[keyName]
no funcionará si keyName
es una cadena con un punto ( "spaceGeometry.ceilingHeight"
), tendrá que dividir la cadena y buscar el valor en cada nivel manualmenteuniqueValues
es una matriz, no un conjunto, así que use .length
en lugar de .size
Hice una función simple getNestedValue()
que usa reduce para extraer un valor anidado de un objeto.
const spaces = [ { "spaceGeometry": { "ceilingHeight": 9 }, "designHubProjectSpaceTypeId": "some Id" }, { "spaceGeometry": { "ceilingHeight": 9 }, "designHubProjectSpaceTypeId": "some other Id" } ]; const getNestedValue = (obj, path) => path.split(".").reduce((accum, key) => accum[key], obj); const getNullOrUniquePropertyValue = (arrToCheck, keyName) => { const uniqueValues = [...new Set(arrToCheck.map((v) => getNestedValue(v, keyName)))]; if (uniqueValues.length !== 1) { return null; } return uniqueValues[0]; }; const result = getNullOrUniquePropertyValue( spaces, 'spaceGeometry.ceilingHeight' ); console.log(result);
includeFullObject
de mi ejemplo porque no es relevante para este problema en particular y no tengo claro qué se supone que debe hacer. Si también tiene problemas con esa parte, hágame saber los detalles y puedo ayudarlo.