何らかの理由で、私が書いた次のフィルター機能が結果配列に正しく追加されません。フィルター一致の結果オブジェクトの 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);
});