3

У меня есть две коллекции (меню и заказы)Как объединение/слияние двух Коллекции их «ид» с использованием UnderscoreJS

коллекция Меню содержит массив п объектов

[{'id': '1', 'name': 'apple'}, {'id': '2', 'name': 'orange'}] 

И Распоряжения коллекция также содержит массив объектов Пункт

[{'id': '1', 'quantity': '0'}] 

И я хочу, т Кромка слилась воедино их атрибуты по идентификатору в другую коллекцию (это необходимо только для шаблонных):

[{'id': '1', 'name': 'apple', 'quantity': '1'}, {'id': '2', 'name': 'orange'}] 

Есть ли способ подчеркивания на это, или мне нужно определить функцию для этого? [Кажется, я перепробовала все сливающиеся функции на подчеркивании, но ни один из них не работают, как я ожидал]

ответ

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/

+0

да, спасибо за это, он также включает в себя другие атрибуты коллекции заказов через _.extend – user1076813

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

Не думает, что есть функция, определенная в подчеркивании .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); 
+1

Также вы можете использовать метод _.findWhere() со своей сокращенной записью: _.findWhere (orders, {id: menu.id}); – JuliaCesar

1

Это должно сделать работу:

var result = []; 
_.each(menu, function(el){ 
    _.extend(el,_.where(orders, {id: el.id})[0] || {}); 
    result.push(el); 
}); 
2

If это союз, который вы хотите сделать, вы можете сделать это, используя знак подчеркивания:

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

EDIT: Я написал сообщение в блоге, если вы хотите получить более подробную информацию: http://geekcoder.org/union-of-two-collections-using-underscorejs/

Смежные вопросы