如何合并对象数组
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>
相关文章:
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 在Javascript中转换对象数组
- 在JavaScript中通过索引从对象数组中获取值
- Backbone虹吸以获取对象数组
- 如何在DataTables 2.1中迭代对象数组
- Javascript-根据赋值顺序,按键合并对象数组
- 将事件附加到对象/数组
- jQuery$.inArray()总是返回-1和一个对象数组
- javascript处理一个对象数组以获得一个新的对象数组
- javascript在数组中获取对象数组中键的所有不同值
- 在对象数组中查找多个值的d3范围
- Undercore.js获取对象数组中键对象的值
- 在mongoose中使用正则表达式在对象数组中进行查询搜索
- 如何通过json对象数组为嵌套对象赋值
- 如何循环通过2个对象数组并通过匹配id进行合并
- 为对象数组创建列表项
- 如何使用javascript合并两个对象数组
- JSON到对象数组,并向每个对象添加项
- JavaScript:从对象数组中获取唯一值及其计数
- 按不同项目对对象数组进行排序