[英]How do I union/merge two Collections by their 'id' using UnderscoreJS
我有两个收藏(菜单和订单)
菜单集包含Item对象的数组
[{'id': '1', 'name': 'apple'}, {'id': '2', 'name': 'orange'}]
Orders集合还包含Item对象的数组
[{'id': '1', 'quantity': '0'}]
我希望它们通过ID将它们的属性合并到另一个集合中(这仅用于模板目的):
[{'id': '1', 'name': 'apple', 'quantity': '1'}, {'id': '2', 'name': 'orange'}]
是否有下划线方法或我需要为此定义一个函数? [似乎我在下划线上尝试了所有合并函数,但它们都没有按我预期的方式工作]
不要认为在underscore.js中定义了一个函数,但是一种方法是使用_.map和_.find函数,如下所示,
var menus = [{'id': '1', 'name': 'apple'}, {'id': '2', 'name': 'orange'}];
var orders = [{'id': '1', 'quantity': '0'}];
var newMenu = _.map(menus, function (menu) {
var order = _.find(orders, function (o) {
return o.id == menu.id;
});
return _.extend(menu, order);
});
console.log(newMenu);
这应该做的工作:
var result = [];
_.each(menu, function(el){
_.extend(el,_.where(orders, {id: el.id})[0] || {});
result.push(el);
});
假设您的收藏品是Backbone收藏品
var menus = new Backbone.Collection([
{'id': '1', 'name': 'apple'},
{'id': '2', 'name': 'orange'}
]);
var orders = new Backbone.Collection([{'id': '1', 'quantity': 1}]);
您可以利用集合和collection.get
上代理的函数:
var merged = menus.map(function(menu) {
var id = menu.get('id'),
order = orders.get(id);
if (!order) return menu.toJSON();
return _.extend(menu.toJSON(), order.toJSON());
});
和http://jsfiddle.net/bs6jN/一起玩的小提琴
如果它是你想要的联盟,你可以使用下划线方式:
// collectionUnion(*arrays, iteratee)
function collectionUnion() {
var args = Array.prototype.slice.call(arguments);
var it = args.pop();
return _.uniq(_.flatten(args, true), it);
}
它只是原始函数_.union(*arrays)
的改进,将_.union(*arrays)
添加到工作集合(对象数组)。
在这里如何使用它:
var result = collectionUnion(a, b, c, function (item) {
return item.id;
});
正在使用数组的原始函数看起来像这样:
_.union = function() {
return _.uniq(flatten(arguments, true, true));
};
在奖金中有一个完整的例子:
// collectionUnion(*arrays, iteratee)
function collectionUnion() {
var args = Array.prototype.slice.call(arguments);
var it = args.pop();
return _.uniq(_.flatten(args, true), it);
}
var a = [{id: 0}, {id: 1}, {id: 2}];
var b = [{id: 2}, {id: 3}];
var c = [{id: 0}, {id: 1}, {id: 2}];
var result = collectionUnion(a, b, c, function (item) {
return item.id;
});
console.log(result); // [ { id: 0 }, { id: 1 }, { id: 2 }, { id: 3 } ]
编辑:如果你想了解更多细节,我写了一篇博客文章: http : //geekcoder.org/union-of-two-collections-using-underscorejs/
我们可以像这样与普通的js合并
var arrOne = [{'id': '1', 'name': 'apple'}, {'id': '2', 'name': 'orange'}];
var arrTwo = [{'id': '1','quantity': '0'}];
function mergeArr(arrOne, arrTwo) {
var mergedArr = [];
arrOne.forEach(function (item) {
var O = item;
arrTwo.forEach(function (itemTwo) {
if (O.id === itemTwo.id) {
O.quantity = itemTwo.quantity;
}
});
mergedArr.push(O);
});
return mergedArr;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.