0

何らかの理由で、私が書いた次のフィルター機能が結果配列に正しく追加されません。フィルター一致の結果オブジェクトの X 個の数ではなく、最後の結果オブジェクトの X 回の出現を挿入するようです。両方の場所の「results.push(result)」を「console.log(result)」に置き換えると、コンソール ウィンドウに適切な/異なる X 結果オブジェクトが返されます。この奇妙な動作が発生している理由は何ですか?

目標は、X 個の結果オブジェクトの結果配列を取得することです。各結果オブジェクトには、一致する各番組名 (曜日と時間の親、ネットワーク、タイトル、エピソードの兄弟など) の親/兄弟オブジェクトからの適切な値が含まれます。

// simple filter used to search show names
filter: function(el, string) {
    console.clear();
    string = $.trim(string);
    var results = [];
    var result = {};
    if ( string.length ) {
        for ( var i=0; i < el.length; i++ ) {
            for ( var j=0; j < el[i]["time"].length; j++ ) {
                if ( _.isArray(el[i]["time"][j].show) ) {
                    for ( var k=0; k < el[i]["time"][j].show.length; k++ ) {
                        if ( el[i]["time"][j].show[k]["@attributes"]["name"].search(new RegExp(string, "i")) > -1 ) {
                            result.day = el[i]["@attributes"]["attr"];
                            result["time"] = el[i]["time"][j]["@attributes"].attr;
                            result.show = el[i]["time"][j].show[k]["@attributes"]["name"];
                            result.sid = el[i]["time"][j].show[k].sid;
                            result.network = el[i]["time"][j].show[k].network;
                            result["title"] = el[i]["time"][j].show[k]["title"];
                            result.ep = el[i]["time"][j].show[k].ep;
                            result["link"] = el[i]["time"][j].show[k]["link"];
                            results.push(result);
                        }
                    }
                }
                else {
                    if ( el[i]["time"][j].show["@attributes"]["name"].search(new RegExp(string, "i")) > -1 ) {
                        result.day = el[i]["@attributes"]["attr"];
                        result["time"] = el[i]["time"][j]["@attributes"].attr;
                        result.show = el[i]["time"][j].show["@attributes"]["name"];
                        result.sid = el[i]["time"][j].show.sid;
                        result.network = el[i]["time"][j].show.network;
                        result["title"] = el[i]["time"][j].show["title"];
                        result.ep = el[i]["time"][j].show.ep;
                        result["link"] = el[i]["time"][j].show["link"];
                        results.push(result);
                    }
                }
            }
        }
    }
    console.log(results);
}

現在の問題のライブ デモについては、こちらのテスト ページにアクセスしてください。便宜上、ページが完全にロードされたときにフィルター関数がコンソールに反復処理するための大きなオブジェクトをログに記録して、そのオブジェクトの構造を把握できるようにしています。この郵便受け)。

また、フィルターを呼び出す方法は次のとおりです。

// filter show names for user input
$(".search").children("input").keyup(function() {
    var str = $(this).val();
    ctv.filter(ctv.xml.DAY, str);
});
4

1 に答える 1