0

さて、オブジェクトのプロパティ値 (値を表示) の 1 つが検索に一致するオブジェクトの検索結果配列があります。この配列の構造は次のとおりで、任意の数の異なるオブジェクトを含めることができます。

results = [
    {
        day: value,
        time: value,
        show: value,
        sid: value,
        network: value,
        title: value,
        ep: value,
        link: value,
    }
];

すべての結果を 1 つの大きなオブジェクトに統合し、同じ値を持つ日または時間をマージしようとしています。ただし、各日または時間の値を個別に単純に見ることはできません。たとえば、火曜日にも午後 9 時がある場合、月曜日の午後 9 時を保持する必要があります。

これを行うために、次のような新しいオブジェクト構造を作成しようとしています:

for ( var i=0; i<results.length; i++ ) {
    var uniqtime = results[i]["time"];
    var uniqshow = results[i].show;
    uniqresults[results[i].day] = {
        uniqtime: {
             uniqshow: {
                sid: results[i].sid,
                network: results[i].network,
                title: results[i]["title"],
                ep: results[i].ep,
                link: results[i]["link"]
            }
        }
    };
}

しかし、変数サブオブジェクトのキー名は文字列として扱われるため、明らかにこれは機能しません。

代わりに、次のように変数サブオブジェクト/キーを作成しようとすると:

for ( var i=0; i<obj.length; i++ ) {
    uniqresults[results[i].day] = {};
    uniqresults[results[i].day][results[i]["time"]] = {};
    uniqresults[results[i].day][results[i]["time"]][results[i].show] = {
        sid: obj[i].sid,
        network: results[i].network,
        title: results[i]["title"],
        ep: results[i].ep,
        link: results[i]["link"]
    };
}

確かに適切なキー名を作成できますが、各キー ( uniqresults[obj[i].day] = {}& uniqresults[obj[i].day][obj[i]["time"]] = {}) を定義するために空のオブジェクトを宣言する必要があります。このように宣言しないと、必要な他のサブキー/値を挿入できません。ただし、このように宣言すると、新しい結果オブジェクトを読み取るたびにサブキー名を本質的に空にしているため、結果配列を正しくマージできません!

多分私はこれを必要以上に複雑にしています。たぶん、より簡単な方法、またはアンダースコアまたはjqueryが手元のタスクを簡素化できる方法があります。とにかく、私は現時点で適切な解決策を切望しています。

4

3 に答える 3

2

より広い問題に対するより適切な解決策があるかどうかはわかりませんが、毎回サブオブジェクトを上書きする問題は、サブオブジェクトを作成する前に既に存在するかどうかを確認することで解決できます。

JS でこれを行う比較的コンパクトで慣用的な方法は、||演算子を使用することです。これは、ほとんどの言語とは異なり、単に boolean ではなく true に評価される引数を返しますtrue

uniqresults[results[i].day] = uniqresults[results[i].day] || {};

初回uniqresults[results[i].day]は未定義になるため、false と評価されるため、{}割り当てられます。ただし、その後は true と評価されるオブジェクトになるため、変数をそれ自体に割り当て、変更しないままにします。

于 2013-07-27T21:30:47.840 に答える
2

これらのオブジェクトを再定義するときに条件チェックを使用できるようです。

var day, time;
for ( var i=0; i<obj.length; i++ ) {
    // Instantiate the day reference if it doesn't exist
    day = uniqresults[results[i].day] = uniqresults[results[i].day] || {};

    // Instantiate the time reference if it doesn't exist
    time = day[results[i].time] = day[results[i].time] || {};

    time[results[i].show] = {
        sid: obj[i].sid,
        network: results[i].network,
        title: results[i]["title"],
        ep: results[i].ep,
        link: results[i]["link"]
    };
}

乾杯!

于 2013-07-27T21:32:19.467 に答える
0

オブジェクトのキーが存在しない場合にのみ、空のオブジェクトを作成します。

if(!(results[i].day in uniqresults)){
   uniqresults[results[i].day] = {};
}

そしてサブキーなど。

于 2013-07-27T21:30:33.853 に答える