Cómo eliminar valores nulos del objeto javascript

Tengo un objeto javascript que contiene dos matrices. A veces, una de las matrices puede estar vacía. Estoy tratando de recorrer el objeto a través de una función recursiva, pero no quiero que ninguna matriz que esté vacía o cadenas vacías ingrese al ciclo. Lo que tengo hasta ahora es producir el error. Typeerror: obj.filter is not a function.

NOTA: obj es en este ejemplo tiene dos matrices dentro de él, pero en realidad, podría ser cualquier cosa que pase a la función.

var obj = {
    selected: [ "value1", "value"2],
    unselected: []
}

function clearAndSetSelectElement($elem, obj, isEmpty) {
    if(isEmpty) $elem.empty(); //empty the select element if it isn't empty
    $.each(obj.filter(function(v){return v != null}), function() { //filter out empty arrays or empty strings
        if(this instanceof Array) clearAndSetSelectElement($elem, this, false); //if this is an array make recursive call
        $elem.append("<option />").val(this).text(this)); //append value to select element
    });
}

preguntado el 27 de julio de 12 a las 14:07

Creo que es mejor usar $.filter() de jQuery (api.jquery.com/filter), que funciona en todos los navegadores. -

2 Respuestas

obj.filter no es una función, pero obj.selected.filter debería serlo (obj es un objeto, no una matriz).

Supongo que no funcionará en IE7 de forma predeterminada, tendrá que copiar el polyfill de Mozilla Developer's Network (DND) o use Modernizr.

Respondido 27 Jul 12, 14:07

el obj es una variable por lo que no siempre será obj.selected. Podría pasar cualquier cosa realmente. Quería poder filtrar cualquier matriz que estuviera vacía o cualquier valor nulo pasado al ciclo: bflemi3

Sí, me di cuenta mientras tanto, mira esta pregunta: stackoverflow.com/questions/5072136/… - Adán

Puede ser que pueda probar esto (si desea completar una selección con algunas opciones de una matriz)

HTML

<select id="sel"></select>​

JS

function setSelect(elem, obj)
{
    for(var o in obj)
    {
        if(obj[o] instanceof Array && obj[o].length)
        {
            $.each(obj[o], function(key, value) {   
                elem.append($("<option></option>").attr("value",value).text(value)); 
            });
        }
    }
}

Rellene la selección usando setSelect función

var obj = {
    selected: [ "value1", "value2"],
    unselected: []
}

var elem=$('#sel');            
setSelect(elem, obj);

DEMO.

Respondido 27 Jul 12, 15:07

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