35

Underscore.jsextend関数を取得する方法はありますか?

ソースオブジェクトのすべてのプロパティをデスティネーションオブジェクトにコピーし、デスティネーションオブジェクトを返します。これは順序どおりであるため、最後のソースは前の引数の同じ名前のプロパティをオーバーライドします。

...再帰的に作業するには?

実際、のqueryプロパティは、で定義されcreditOperationたプロパティを完全にオーバーライドします。querybaseOperation

var url = require('url')
  , _ = require('underscore'),
  , baseOperation = {
        host: 'gateway.skebby.it',
        pathname: 'api/send/smseasy/advanced/http.php',
        protocol: 'https',
        query: {
            'username': 'foo',
            'password': 'bar',
        }
    };

var creditOperation = _.extend(baseOperation, {
    query: {
        'method': 'baz'
    }
});

console.log(url.format(creditOperation));

これを入手したいcreditOperation

{
    host: 'gateway.skebby.it',
    pathname: 'api/send/smseasy/advanced/http.php',
    protocol: 'https',
    query: {
        'username': 'foo',
        'password': 'bar',
        'method': 'baz'
    }
}
4

6 に答える 6

40

Lodash (アンダースコアのフォーク)を使用すると、次のことができますLodashの_.extendメソッドは、3番目(またはそれ以上)のパラメーターを関数として受け入れ、値(古いものと新しいもの)を受け取ります。したがって、次のようなことができます。

var deep = function(a, b) {
    return _.isObject(a) && _.isObject(b) ? _.extend(a, b, deep) : b;
};

var a = {a:{b:{c:1}}},
    b = {a:{b:{z:1}}};

_.extend(a,b,deep);

upd。Paolo Morettiがコメントで述べたように、lodashには_.mergeと呼ばれる同じ 関数あります。

_.merge(a,b);
于 2013-09-03T15:17:10.627 に答える
24

jQueryにはextend()関数があり、これは対応するアンダースコアと同じことを行いますが、必要に応じて再帰的にマージできるようにする深い引数もあります。

var creditOperation = $.extend(true, baseOperation, {
    query: {
        'method': 'baz'
    }
});

または、 baseOperationを上書きしたくない場合:

var creditOperation = $.extend(true, {}, baseOperation, {
    query: {
        'method': 'baz'
    }
});
于 2014-07-02T23:27:26.957 に答える
21

アンダースコアは、さまざまなタイプのオブジェクトを処理するには複雑すぎると見なされるため、深い拡張を追加する予定はありません。代わりに、ユーザーは必要なものをサポートする独自のソリューションを実装することをお勧めします。

あなたの場合、それは単なるオブジェクトなので、実装は非常に簡単です。

_.deepObjectExtend = function(target, source) {
    for (var prop in source)
        if (prop in target)
            _.deepObjectExtend(target[prop], source[prop]);
        else
            target[prop] = source[prop];
    return target;
}
于 2013-02-12T23:43:58.697 に答える
8

値がオブジェクトではなく文字列である場合の修正を含む、Bergiのディープ拡張のスタンドアロンバージョン。また、より厳密になるようにパッチが適用されます。

function deepObjectExtend (target, source) {
    for (var prop in source) {
        if (source.hasOwnProperty(prop)) {
            if (target[prop] && typeof source[prop] === 'object') {
                deepObjectExtend(target[prop], source[prop]);
            }
            else {
                target[prop] = source[prop];
            }
        }
    }
    return target;
}
于 2015-04-10T13:56:37.570 に答える
2

Kurt Milamは、underscore.jsにメソッドを追加するミックスインをdeepExtend公開しました。正規表現も処理します(必要な場合)。ドキュメントからの抜粋:

underscore.jsと混ぜてください: _.mixin({deepExtend: deepExtend});

このように呼んでください:var myObj = _.deepExtend(grandparent, child, grandchild, greatgrandchild)

注:乾いた状態に保ってください。

この関数は、JSON構成ドキュメントを操作している場合に特に便利です。これにより、最も一般的な設定を使用してデフォルトの構成ドキュメントを作成し、特定の場合にそれらの設定をオーバーライドできます。任意の数のオブジェクトを引数として受け入れ、構成ドキュメントの階層をきめ細かく制御できます。

于 2015-08-26T16:07:48.060 に答える
2

アンダースコアのextend()は深い拡張を行いません。実際のところ、アンダースコアには深く拡張できる機能はありません。

そのためにlodashのマージを使用できます。

于 2016-08-12T00:04:52.803 に答える