如何合并对象数组?
How can I merge an array of objects?
假设我有一系列文章,每篇文章可能有也可能没有超过 1 个图像对象,现在由于 mysql 不能将对象组合在一起,你必须自己做。所以结果是你得到 near 重复的文章对象......唯一的区别是图像对象。 接近 重复我的意思是 returned 结果的唯一区别是图像对象。
我试图找到一种方法来遍历 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 功能,但它似乎只 return 最后 article (articleId: 11)
...它似乎也没有找到所有图像。它只会在每篇文章中创建一个图像数组。请注意 res 是 article 对象的数组(如上所示)
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()
用第一项关联每篇文章,然后设置images
属性 通过 _.map()
.
获取所有 image
项
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>
假设我有一系列文章,每篇文章可能有也可能没有超过 1 个图像对象,现在由于 mysql 不能将对象组合在一起,你必须自己做。所以结果是你得到 near 重复的文章对象......唯一的区别是图像对象。 接近 重复我的意思是 returned 结果的唯一区别是图像对象。
我试图找到一种方法来遍历 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 功能,但它似乎只 return 最后 article (articleId: 11)
...它似乎也没有找到所有图像。它只会在每篇文章中创建一个图像数组。请注意 res 是 article 对象的数组(如上所示)
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()
用第一项关联每篇文章,然后设置images
属性 通过 _.map()
.
image
项
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>