4

我有两个系列(菜单和订单)

菜单集合包含 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'}]

是否有下划线方法或者我需要为此定义一个函数?[似乎我在下划线上尝试了所有合并功能,但没有一个按我预期的方式工作]

4

5 回答 5

6

不要认为 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);
于 2013-05-08T06:11:02.980 回答
2

假设您的收藏是主干收藏

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/的小提琴

于 2013-05-08T06:34:58.587 回答
2

这应该做的工作:

var result = [];
_.each(menu, function(el){
    _.extend(el,_.where(orders, {id: el.id})[0] || {});
    result.push(el);
});
于 2013-05-08T06:16:41.837 回答
2

如果是你想做的联合,可以用下划线的方式来做:

// collectionUnion(*arrays, iteratee)
function collectionUnion() {
    var args = Array.prototype.slice.call(arguments);
    var it = args.pop();

    return _.uniq(_.flatten(args, true), it);
}

它只是对原始函数的改进,在_.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/

于 2015-06-26T10:59:00.967 回答
1

我们可以像这样与普通 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;
    }
于 2013-05-08T05:59:06.707 回答