JQuery или JavaScript, как найти, если массив содержит объект и этот объект имеет имя с указанным значением

0

Я пытаюсь создать массив объектов для сохранения состояния меню в cookie, но он не обновляется, потому что он не находит нужный индекс, содержащий объект, который мне нужен для обновления видимости. Что я делаю неправильно и/или могу указать мне в правильном направлении?

$(document).ready(function() {
    var menu = new Array();
    $("#vertical-nav .head").click(function() {
        var c = $(this).next().attr('name');
        $(this).next().slideToggle("slow", function() {
            if ( $(this).next().is(':visible') ) {
                menu.push({
                    name: c,
                    visible: true,
                });
            } else {
                var index = $.inArray(c, menu);
                console.log("INDEX: " + index);
                menu[index] = { name: c, visible:false };
            }
        });
        console.log(menu);
    });
});

Это то, с чем я столкнулся:

$(document).ready(function() {
    var menu = new Array();
    if ( $.cookie('menu') ) {
        var items = JSON.parse($.cookie('menu'));
        for ( var item in items ) {
            if ( items[item].visible ) {
                $("div[name='" + items[item].name + "']").show();
            }
            menu.push(items[item]);
        }
    }

    $("#vertical-nav .head").click(function() {
        var c = $(this).next().attr('name');
        if ( $(this).next().is(":visible") ) {
            hide(this, c);
        } else {
            show(this, c);
        }
    });

    function show(obj, c) {
        $(obj).next().slideDown('slow', function() {
            var elementExists = false;
            if ( menu.length > 0 ) {
                for ( var item in menu ) {
                    if ( menu[item].name == c ) {
                        elementExists = true;
                        menu[item].visible = true;
                    }
                }
            }
            if ( !elementExists ) {
                menu.push({
                    name: c,
                    visible: true,
                });
            }
            $.cookie('menu', JSON.stringify(menu));
        });
    }

    function hide(obj, c) {
        $(obj).next().slideUp('slow', function() {
            if ( menu.length > 0 ) {
                for ( var item in menu ) {
                    if ( menu[item].name == c ) {
                        menu[item].visible = false;
                    }
                }
            }
            $.cookie('menu', JSON.stringify(menu));
        });
    }
});
  • 0
    У меня нет времени, чтобы написать пример на данный момент, но посмотрите функцию grep в jQuery, она, скорее всего, содержит то, что вы ищете: api.jquery.com/jQuery.grep
  • 1
    console.log(menu) в конце происходит перед вашим оператором if, который изменяет menu . Вставьте его в setTimeout с 5-секундной задержкой, и вы поймете, что я имею в виду.
Теги:
object
arrays

1 ответ

1
Лучший ответ

Вы можете легко сделать это:

if (menu.length > 0) {
    for (var item in menu) {
        if (menu[item].name=="some text") alert("Found it!");
    }
}

Я бы рассмотрел вместо [{name: "item"; visible: true}] [{name: "item"; visible: true}] переключается на пару ключ/значение. Затем вы можете использовать {"item": true}, но это ограничивается только хранением видимого значения, и никакая дополнительная информация не может быть сохранена в ключе. Чтобы решить эту проблему, попробуйте {"item": {visible: true}}. Здесь пример обнаружения в JS с использованием этого подхода:

if (menu.length > 0) {
    for (var item in menu) {
        var strVisible="hidden";
        if (menu[item].visible==true) strVisible="visible";
        alert(item+" is "+strVisible);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню