繁体   English   中英

如何合并一组对象?

[英]How can I merge an array of objects?

假设我有一系列文章,每篇文章可能有也可能不超过1个图像对象,现在由于mysql无法将对象组​​合在一起,您必须自己做。 所以结果是你接近重复的文章对象......唯一的区别是图像对象。 通过接近重复,我的意思是返回结果的唯一区别是图像对象。

我试图找到一种方法来循环遍历articles数组并消除重复对象并创建一个images数组来保存每个article图像对象。

例如,给出以下文章数组:

{ 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 reduce 函数,但它似乎只返回最后article (articleId: 11) ...它似乎也没有找到它的所有图像。 它只会在每篇文章中创建一个图像数组。 请注意, 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;
}, {});

最终结果将如下所示:

{ 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'} 
   ]},
]}

您可以使用_.groupBy()来匹配article.articleId ,然后_.map()使用第一项关联每篇文章,然后通过_.map()获取所有image项来设置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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM