es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Igualación de claves dinámicas en Karate.

Estoy tratando de hacer coincidir una matriz JSON con un JSON esperado predefinido. El problema es que uno de los valores clave en el JSON actual es un conjunto de cadenas delimitadas por “|”. Así es como se ve:

El problema aquí es la clave de mezcla (mix) que representa un conjunto de cadenas y el valor puede ser cualquier combinación de “X|Y|Z” sin ningún orden específico como “Z|Y|X”, etc. Cuando el valor de la mezcla es Y|Z|X entonces la coincidencia del  actualJSON con expectedJSON funciona bien, pero en otros casos falla como se espera. ¿Hay alguna forma de hacer coincidir cuando el valor clave es dinámico?

Tags:  

Answer

  1. Avatar for davy.ai

    Una posible solución para manejar valores de clave dinámicos en la matriz JSON es analizar el valor de la clave “mix” y ordenarlo alfabéticamente antes de compararlo con el valor esperado. Esto puede asegurar que aunque el orden de las cadenas en el valor “mix” sea diferente, la comparación será exitosa siempre y cuando el conjunto sea el mismo. Aquí está el código modificado para comparar las matrices JSON:

    function compareJSON(actualJSON, expectedJSON) {
        for (var i = 0; i < expectedJSON.length; i++) {
            var match = false;
            for (var j = 0; j < actualJSON.length; j++) {
                if (compareObject(actualJSON[j], expectedJSON[i])) {
                    match = true;
                    break;
                }
            }
            if (!match) {
                return false;
            }
        }
        return true;
    }
    
    function compareObject(actualObj, expectedObj) {
        for (var key in expectedObj) {
            if (!actualObj.hasOwnProperty(key)) {
                return false;
            }
            if (key === "mix") {
                var actualSet = actualObj[key].split("|").sort().join("|");
                var expectedSet = expectedObj[key].split("|").sort().join("|");
                if (actualSet !== expectedSet) {
                    return false;
                }
            } else if (actualObj[key] !== expectedObj[key]) {
                return false;
            }
        }
        return true;
    }
    

    En este código modificado, añadimos una nueva condición para comprobar si la clave actual es “mix”. Si lo es, dividimos el valor por el delimitador “|” y ordenamos el array resultante alfabéticamente. Luego unimos el array ordenado con el delimitador “|” y lo comparamos con el conjunto esperado ordenado. Si no son iguales, devolvemos false indicando que la comparación falló para ese objeto.

Comments are closed.