15

私は現在、大きな JavaScript プロジェクトに取り組んでおり、(バックエンドから) 入ってくる JSON データを自分の JavaScript オブジェクトにマッピングするのに苦労しています。

Knockout JavaScript MVVM フレームワークを使用しています。これにはマッピング プラグインが含まれていますが、実際にプロパティを再マッピングすることはできません。受信する JSON データが細かすぎるため、これを実現したいと考えており、JS オブジェクトを「フラット化」したいと考えています。以下に例を示します。

着信データ。

Object : {
    Description: {
        Id : 1,
        Title : 'ProductX'
    },
    Price : {
        Last : 12,
        Currency : 3
    }
}

そして、これを次のようにリマップ/フラット化したいと思います:

var mappedObject = {
    id : 1,
    title: 'ProductX',
    price : 12,
    currency : 3
}

したがって、マッピング構成を提供し、どの入力プロパティをどの出力プロパティにマッピングする必要があるかを詳しく説明したいと思いますDozerが構成されているのと同じように。

私の質問は、私が達成したいことができるライブラリはありますか、それとも独自のライブラリを構築する必要がありますか?

4

4 に答える 4

10

このトピックが最後に更新されてからしばらく経ちました。人々はおそらくオブジェクトからオブジェクトへのマッパーを今でも探しているので:

昨年、まさにこのシナリオのために、C# AutoMapper 実装の TypeScript / JavaScript への移植を作成しました。コードを GitHub ( https://b.ldmn.nl/AutoMapperTS ) に置きました。automapper-ts NPM または Bower パッケージを使用してライブラリを直接使用することもできます。

ライブラリはほぼ完全に文書化されています。さらに、かなりの数の Jasmine 単体テストが既に利用可能です (コード カバレッジは約 95% です)。彼らはあなたが何を必要としているのかを説明してくれるはずです。

このライブラリがあなたのニーズに合っていることを願っています。ご質問やご意見がございましたら、お気軽にお問い合わせください。

于 2016-06-17T07:19:02.983 に答える
8

まあ、これは非常に簡単に聞こえるので、これのためのライブラリはないと思います。

次に例を示します。

var obj = {
    Description: {
        Id : 1,
        Title : 'ProductX'
    },
    Price : {
        Last : 12,
        Currency : 3
    }
},
    mappedObject = {};

function mapThat( obj, mappedObject ) {
    Object.keys( obj ).forEach( function( key ) {
        if ( typeof obj[ key ] === 'object' ) {
            // If it's an object, let's go recursive
            mapThat( obj[ key ], mappedObject );
        }
        else {
            // If it's not, add a key/value
            mappedObject[ key.toLowerCase() ] = obj[ key ];
        }
    } );
}

mapThat( obj, mappedObject );

console.log( mappedObject );​

デモはこちら: http://jsfiddle.net/qG6hm/

于 2012-05-21T13:11:32.073 に答える
3

実際、knockoutjs マッピング プラグインを使用すると、まさにそれを行うことができます。

呼び出しではko.mapping.fromJS、含まれているプロパティをマップするために使用されるマッピング オブジェクトを提供できます...

var mapper = {
    create: function(options){
        return { name: ko.observable(options.data.name) };
    }
};

つまり、このマッパーをマッピング プラグインと共に使用すると、すべてのオブジェクトがフラット化されて、その名前のみをオブザーバブルとして含むオブジェクトになります。

次のように使用します。

var viewModel = ko.mapping.fromJS({id: 1, name: "a", desc: "b"}, mapper);

この場合、viewModelはプロパティ名のみを持ちます。

この機能の詳細については、こちらの公式ドキュメントを参照してください。

于 2012-05-21T13:17:45.270 に答える