0

動的テンプレートに基づいて JSON オブジェクトのプロパティと値をフィルタリングする必要があります (セキュリティ上の理由から)。これは、実行時にのみ認識されるマスクを通して JSON オブジェクトを表示するようなものです。

次の JSON オブジェクトがあるとします。

{ "id": "1",
  "foo": [ "1", "2", "3" ],
  "bar": [ "a", "b", "c"],
  "fuzz": [ "y", "x" ]
}

そして、このテンプレート:

{ "id": "",
  "fuzz": [ "y", "z"],
  "foo": ""
}

今、私は次の結果を得たいと思っています(テンプレートをオブジェクトに適用します):

{ "id": "1",
  "fuzz": [ "y" ],
  "foo": [ "1", "2", "3" ]
}

フィルタリングするための最良のソリューションは何ですか

  1. プロパティのみ (値はそのまま)?
  2. プロパティと値 (上記の例のように)?

ノート:

  • プロパティと値の順序は、テンプレートとオブジェクトの間で異なる場合があります
  • 私の環境はNodeJS + BackboneJSです
  • フィルタリングするオブジェクトが多いため、パフォーマンスが重要
4

2 に答える 2

0

WiredPrairie の提案に基づいて、_.pick() と _.intersection() を書き直して、このトリックを実行する次のメソッドにしました。

// Loosely based on Underscore.js _.pick() method
function project(obj, tmp) {
    var copy = {};
    var keys = _.keys(tmp);
    _.each(keys, function(key) {
        if (key in obj) {
            var vals = tmp[key];
            if (Array.isArray(vals)) {
                var copy_vals = [];
                // Next lines could be replaced by:
                // cvals = _.intersection(vals, obj[key]);
                _.each(vals, function(val) {
                    if ($.inArray(val, obj[key])!=-1) {
                        copy_vals.push(val);
                    };
                });
                copy[key] = copy_vals;
            } else {
                copy[key] = obj[key];
            };
        };
    });
    return copy;
}
于 2013-03-16T21:09:58.003 に答える
-1

よくわかりませんが、これを読んでみてくださいjQuery.extend

于 2013-03-16T09:25:05.877 に答える