0

いくつかのデータベース テーブルの結果を保持する一連の json データを反復処理しています。他のデータの中には、RateTable ...erm... テーブルと Resources テーブルがあります。RateTable には、Resources レコードにリンクする ResourceId というプロパティ名があります。

そのため、RateTable を反復処理しています。Resource レコードを参照し、それを独自の変数にコピーして使用する必要があります。これが私がこれまでに持っているものです:

if (data)
    {
        var rs = data.Resources;

        $.each(data.RateTables, function(i,item){
            if (item.RateTableTypeId == 91)
            {
                var r = getresource(item.SupplierResourceId, rs)
                if (r)
                    customer_options += '<option value="' + r.ResourceId + '">' + r.Name + '<\/option>';
            }
            else if (item.RateTableTypeId == 92)
            {
                var r = getresource(item.CustomerResourceId, rs)
                if (r)
                    supplier_options += '<option value="' + r.ResourceId + '">' + r.Name + '<\/option>';
            }

        });

        $(".ddl-customer").html(customer_options);
        $(".ddl-supplier").html(supplier_options);
    }

    function getresource(id, items)
    {
        $.each(items, function(i,item){
            if (item.ResourceId == id)
                return $.extend(true, {}, item);
        });
    }

問題は、getresource がリソース アイテムのコピーを変数 r に返さないことです。なんで?

申し訳ありませんが、json データの一部を投稿できません。これは非常に大きいため、参照をクライアント側に任せて、データ ペイロードを削減しています。私がやろうとしていることを誰かが理解するのに十分な情報があることを願っています。

ロイド

4

2 に答える 2

2

問題は、getresource がリソース アイテムのコピーを変数 r に返さないことです。なんで?

getresourceには return ステートメントがありません。getresource 内の$.each()呼び出しで使用される無名関数内に return ステートメントがあります。その return ステートメントは無名関数から戻り、$.each()に戻ります。$.each()は、返された値 (存在する場合) を、反復を続行するかどうかを示すブール値として解釈します。しかし、その値がgetresourceに返されることはありません。これには、とにかくそれを返す return ステートメントがありません。

$.each()の詳細については、http: //docs.jquery.com/Utilities/jQuery.each#objectcallback を参照してください。

考えられる修正の 1 つは、代わりに JavaScript のネイティブforループを使用することです。

function getresource(id, items) {
    for (var i = 0; i < items.length; ++i) {
       var item = items[i];
       if (item.ResourceId == id) {
           return $.extend(true, {}, item);
       }
    }
}

別のオプションは、$.each()を使い続けることですが、 getresourceから戻ります。

function getresource(id, items) {
    var r = null;
    $.each(items, function(i, item){
        if (item.ResourceId == id) {
            r = $.extend(true, {}, item);
            return false; // end $.each() loop
        }
    });
    return r;
}
于 2009-12-21T05:14:42.103 に答える
1

私はまだ学習中であり$.extend、関数から を返す人を見たことがないことを認めます...

値が見つからない場合は false を返す必要があるという Oren の意見は正しいので、彼に +1 を与えます。

return $.extend(false, {}, items);さらに、使用して関数をテストしようとしましたが、オブジェクトで if (r)あるため、常に true になるようです。r

関数から 2 つの変数を返そうとしていると思いますか? とにかく、関数から複数の変数を返す最良の方法は、次のようなものを使用することです。

function getresource(id, items) {
  $.each(items, function(i, item) {
    if (item.ResourceId == id)
      return [true, item];
  });
  return false;
}

r[0] にはブール値が含まれ、r[1] にはアイテムが含まれます (true の場合)。

于 2009-12-21T05:51:28.077 に答える