2016-04-29 20 views
2

私はアーティクルの配列を持っていたとします。各アーティクルには1つ以上のイメージオブジェクトが含まれていてもいなくても、mysqlはオブジェクトをグループ化できないので、自分で行う必要があります。だから結果は重複記事オブジェクトの近くにあります...唯一の違いは画像オブジェクトです。 近辺と重複しています。返される結果の唯一の違いはイメージオブジェクトです。どのようにオブジェクトの配列をマージできますか?

私はarticlesの配列をループし、重複したオブジェクトをエリートして、それぞれのarticleイメージオブジェクトを保持するimages配列を作成する方法を見つけようとしています。例えば

記事の下に配列を指定:

{ articles: [ 
    {article: {articleId: 10, articleText: 'blah'}, image: {articleId: 10, imageUrl: 'http://differentUrlTooBelow'} }, 
    {article: {articleId: 10, articleText: 'blah'}, image: {articleId: 10, imageUrl: 'http://AnotherUrlDifferentToAbove'} }, 
    {article: {articleId: 11, articleText: 'ajsdnfa'}, image: {articleId: 11, imageUrl: 'http://DifferentUrlTooBelow'} }, 
    {article: {articleId: 11, articleText: 'asfdjnasjdf'}, image: {articleId: 11, imageUrl: 'http://AnotherUrlDifferentToAbove'} }, 
]} 

を私たちは、機能を減らすlodashを使用することができますが、それは最後article (articleId: 11)を返すように見える...それはイメージですすべてを見つけるように見えるしません。どちらか。各記事の中にイメージ配列を作成するだけです。

{ articles: [ 
    {article: {articleId: 10, articleText: 'blah'}, 
    images: [ 
     {articleId: 10, imageUrl: 'http://differentUrlTooBelow'}, 
     {articleId: 10, imageUrl: 'http://AnotherUrlDifferentToAbove'} 
    ]}, 
    {article: {articleId: 11, articleText: 'blah'}, 
    images: [ 
     {articleId: 11, imageUrl: 'http://differentUrlTooBelow'}, 
     {articleId: 11, imageUrl: 'http://AnotherUrlDifferentToAbove'} 
    ]}, 
]} 
+0

おそらく、[ 'groupBy'](https://lodash.com/docs#groupBy)の線に沿って何かを使用します。 – zzzzBov

+0

イメージオブジェクトの 'articleId'を除外することができます。既に親の 'article'オブジェクトの一部であるため、冗長データのようです。あなたのイメージから来る唯一のデータがあなたが[group_concat](http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group- concat)をmysqlクエリに入れ、その後実際にURLを使用する必要があるときに分割します –

答えて

2

あなたがに_.groupBy()を利用することができます:RESは、最終的な結果は次のようになります(上図のように)記事オブジェクト

var z = _.reduce(res, function(result, value, key) { 
if (key == 0) return; 
if(value.article['articleId'] == res[key-1].article['articleId']) { 
    result = value; 
    result.images = []; 
    result.images.push(result.image); 
} 

return result; 
}, {}); 

の配列であることに注意してくださいarticle.articleIdと一致し、次に_.map()を使用して最初のアイテムを使用して各記事を関連付けると、からまでのアイテムがすべて取得されてimagesプロパティが設定されます。

var data = { 
 
    articles: [ 
 
    { 
 
    article: {articleId: 10, articleText: 'blah'}, 
 
    image: { articleId: 10, imageUrl: 'http://differentUrlTooBelow' } 
 
    }, 
 
    { 
 
    article: {articleId: 10, articleText: 'blah'}, 
 
    image: { articleId: 10, imageUrl: 'http://AnotherUrlDifferentToAbove' } 
 
    }, 
 
    { 
 
    article: {articleId: 11, articleText: 'ajsdnfa'}, 
 
    image: { articleId: 11, imageUrl: 'http://DifferentUrlTooBelow' } 
 
    }, 
 
    { 
 
    article: {articleId: 11, articleText: 'asfdjnasjdf'}, 
 
    image: { articleId: 11, imageUrl: 'http://AnotherUrlDifferentToAbove' } 
 
    } 
 
    ] 
 
}; 
 

 
var result = { 
 
    articles: _(data.articles) 
 
    .groupBy('article.articleId') 
 
    .map(function(items) { 
 
     return _(items[0]) 
 
     .omit('image') 
 
     .set('images', _.map(items, 'image')) 
 
     .value(); 
 
    }) 
 
    .value() 
 
}; 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.11.2/lodash.js"></script>

+0

ああいいです。私は本当にロダシュを使ったことはありません!これはかなり強力です:) – James111

+0

ノードでこのサーバ側を実行している場合、 '_(data.articles)'は '_.chain(data.articles)'& '_(items [0])'になります'_.chain(items [0])'も必要です。 – James111

+0

nodejで '_.chain()'を使わずに動作することは間違いありません。 '_.chain()'は、 '_.head()'や '_.last()'のように '.value()'を使わないで解決するメソッドを実際にはしたくない場合にのみ使用されます – ryeballar

関連する問題