Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过两个集合的';id';使用下划线_Javascript_Backbone.js_Underscore.js_Javascript Objects - Fatal编程技术网

Javascript 如何通过两个集合的';id';使用下划线

Javascript 如何通过两个集合的';id';使用下划线,javascript,backbone.js,underscore.js,javascript-objects,Javascript,Backbone.js,Underscore.js,Javascript Objects,我有两个系列(菜单和订单) 菜单集合包含项对象数组 [{'id': '1', 'name': 'apple'}, {'id': '2', 'name': 'orange'}] [{'id': '1', 'quantity': '0'}] 订单集合也包含项目对象数组 [{'id': '1', 'name': 'apple'}, {'id': '2', 'name': 'orange'}] [{'id': '1', 'quantity': '0'}] 我希望它们按ID将属性合并到另一个集合中

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

菜单集合包含项对象数组

[{'id': '1', 'name': 'apple'}, {'id': '2', 'name': 'orange'}]
[{'id': '1', 'quantity': '0'}]
订单集合也包含项目对象数组

[{'id': '1', 'name': 'apple'}, {'id': '2', 'name': 'orange'}]
[{'id': '1', 'quantity': '0'}]
我希望它们按ID将属性合并到另一个集合中(这仅用于模板制作目的):


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

我们可以像这样与纯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;
    }

不要认为在underline.js中为此定义了函数,但一种方法是使用和函数,如下所示

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);
});

假设您的集合是主干集合

var menus = new Backbone.Collection([
    {'id': '1', 'name': 'apple'}, 
    {'id': '2', 'name': 'orange'}
]);

var orders = new Backbone.Collection([{'id': '1', 'quantity': 1}]);
您可以利用集合上代理的函数和:


和一把小提琴

如果这是你想做的工会,你可以用下划线的方式来做:

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

    return _.uniq(_.flatten(args, true), it);
}
它只是对原始函数
的改进,在工作集合(对象数组)中添加了一个迭代对象

以下是如何使用它:

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 } ]

编辑:如果您想了解更多详细信息,我写了一篇博文:

是的,谢谢,它还通过u.extendal包含订单集合的其他属性,因此您可以使用u.findWhere()方法及其“回调速记:u.findWhere(订单,{id:menu.id}”);杰出的我使用它将获取的结果数组与来自第二个HTTP请求(FTW)的装饰数据合并。谢谢@mamoo!