Backbone.js: la mejor manera de manejar múltiples parámetros de filtro anulables

tener la siguiente función en mi --:

getFiltered: function (status, city) {
        return this.filter(function (trainer) {
            return ((status === null) ? trainer : trainer.get("TrainerStatusName") === status) &&
                    ((city === null) ? trainer : trainer.get('City') === city);
        });
    }

¿Cuál es la mejor manera de lidiar con los parámetros anulables pasados, es decir, si la ciudad es nula, entonces ignore el filtro/obtenga todo y si el estado es nulo, ignore el filtro/obtenga todo?

El código anterior funciona, pero tiene curiosidad sobre las alternativas.

preguntado el 01 de julio de 12 a las 17:07

1 Respuestas

Ok, primero que nada, estoy un poco confundido por tu pregunta; el título dice que se trata de manejar parámetros "anulables", pero parece que su código está tratando con parámetros de "caso especial" (específicamente "todos") ... excepto en el caso de que el entrenador sea nulo, pero no lo creo incluso es posible al iterar a través de una colección Backbone.

* * Editar * * OP actualizó la pregunta, por lo que lo anterior ya no es relevante. También he actualizado mi respuesta en consecuencia.

En cualquier caso, no hay nada malo o inusual en su código; Los operadores ternarios son una forma estándar de manejar casos especiales únicos. Sin embargo, si está buscando ideas alternativas, aquí hay una que usa una función adicional para SECAR (eliminar la duplicación) su código:

function matchesOrAll(expected, actual) {
    return expected === null || expected === actual;
}

getFiltered: function (status, city) {
    return this.filter(function (trainer) {
        return matchesOrAll(status, trainer.get("TrainerStatusName") &&
               matchesOrAll(city, trainer.get("City"));
}

* * Editar * *

Ahora que estamos hablando de nulos y no de "todos", vale la pena señalar que hay un mejor patrón para casos más simples de nulos/indefinidos. Si solo estuviera filtrando ciudades, por ejemplo, el código podría ser:

getFiltered: function (expectedCity) {
    return this.filter(function (currentCity) {
        return expectedCity === (currentCity || expectedCity);
}

En otras palabras, puede aprovechar la "veracidad" de Javascript y el hecho de que la disyuntiva (es decir, ||) Las expresiones booleanas devuelven el primer valor verdadero. Esto elimina la necesidad de un ternario, y muchas bibliotecas usan este patrón para completar argumentos no proporcionados; por ejemplo, aquí hay una línea de jQuery que establece el argumento "objetivo" en un nuevo objeto si no se proporciona ninguno:

target = arguments[1] || {};

Sin embargo, desafortunadamente, cuando se trata de propiedades/atributos de cosas (p. trainer.get('foo')) en lugar de solo objetos directamente (p. trainer), no hay un buen atajo que pueda usar (aparte de hacer una función).

Respondido 01 Jul 12, 20:07

Gracias por la respuesta. En realidad, actualicé ese código después de publicar la pregunta. Lo modifiqué ahora para que se ajuste a la pregunta. - samuel goldenbaum

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.