Guión:
Estoy creando una función genérica que devuelve un booleano dependiendo de las declaraciones lógicas AND, sin embargo, la función es genérica y acepta múltiples tipos de objetos y matrices, y las declaraciones pueden variar según los objetos.
por el momento tengo algo asi
private async myFunction( myArray: myArrObj[], myObj : myObj, ): Promise<boolean> { return ( myArr.some( (a) => a.status1=== "*" || a.status1 === myObj.status1.status1Id ) && myArr.some( (a) => a.status2=== "*" || a.status2 === myObj.status2.status2Id ) && myArr.some( (a) => a.status3=== "*" || a.status3 === myObj.status3.status3Id ) && myArr.some( (a) => a.status4=== "*" || a.status4 === myObj.status4.status4Id ) ) }el problema es no poder saber que tipo de matriz se pasa y cuantas comprobaciones se necesitan, como puedo hacer una devolucion? Mi idea era almacenar cada matriz. algún método en una matriz y unirlos con " && ", este enfoque requeriría ejecutar algo desde una cadena, que no estoy seguro de que sea lo más seguro, ya que eval no es seguro en absoluto.
para obtener los estados de myObj, podría usar un bucle for y almacenar la propiedad en una cadena. No se me ocurre una buena solución, así que siéntete libre de proponer algo nuevo si mi idea no es lo suficientemente buena.
Como señalaron otros en los comentarios, sería útil si tuviera un ejemplo reproducible con datos de muestra. Dicho esto, de tu comentario:
pero los estados y las identificaciones tienen nombres diferentes, algunas identificaciones son .nameId y otras son solo .id , pero los estados en sí tienen el mismo nombre, por lo que en lugar de estado1 y obEstado1 realmente deberían ser estado1 y estado1
Desglosando esto:
pero los estados y las identificaciones tienen nombres diferentes, algunas identificaciones son .nameId y otras son solo .id
Podría intentar ver si nameId existe y volver a id .
pero los estados en sí tienen el mismo nombre, por lo que en lugar de estado1 y obEstado1, en realidad debería ser estado1 y estado1
Cuando las entradas de myArr comparten claves con myObj , simplemente puede recorrer las claves de myObj .
async function myFunction(myArr, myObj) { // Fallback value for if .nameId and .id both don't exist. // Falling back to `undefined` would cause a bug / false positives. const notFound = Symbol(); // Loop through every key:value pair in the input object. return Object.entries(myObj).every(([myObjKey, myObjValue]) => { // Handle both `.nameId` and `.id` const id = myObjValue[`${myObjKey}Id`] ?? myObjValue.id ?? notFound; // If `myArrObj`'s children only ever contain exactly // a single key { status2: { someRandomKey: 123 } }, then you // could use myObjValue[Object.keys(myObjValue)[0]]; // For this key--for example "status1"--is there *any* array entry // in `myArrObj` that has the same key and value or "*"? return myArr.some((a) => { return a[myObjKey] === '*' || a[myObjKey] === id; }); }); }Con los siguientes datos de muestra:
const sampleArr = [ { status3: "*" }, { status2: 234 }, { status1: 123, thisIsAnUnusedKey: true }, { status4: 456 }, { name: "Foobar" }, { thisIsAnUnusedArrayEntry: true }, ]; const sampleObj = { status1: { status1Id: 123, }, status2: { status2Id: 234, }, status3: { status3Id: 345, }, status4: { // Different key id: 456, }, name: { // Different dataType nameId: "Foobar" } }; myFunction(sampleArr, sampleObj).then(console.log); // Logs `true`