2017-02-07 19 views
0

В последнее время я начал экспериментировать с функциональным программированием, и я пытаюсь преобразовать старый модуль, который я написал, используя императивное программирование.Функциональное программирование Javascript/Параметры передачи

Скажем, у меня есть два массива объектов

т.е.
orders: [ 
    { 
    idOrder: 1, 
    amount: 100, 
    customerId: 25, 
    }, 
    { 
    idOrder: 2, 
    amount: 200, 
    customerId: 20, 
    } 
] 


customers: [ 
    { 
    customerId: 20, 
    name: "John Doe", 
    orders: [] 
    }, 
    { 
    customerId: 25, 
    name: "Mary Jane", 
    orders: [] 
    } 
] 

Я хочу, чтобы подтолкнуть все заказы к соответствующему клиенту. Есть ли чистый способ сделать это?

Я попытался это, но, очевидно, она не работает таким образом:

customers.orders = orders.filter((x) => { 
    if (x.customerId === customerId) { 
    customer.orders.push(x); 
    } 
}); 

Благодарности

+3

, пожалуйста, добавьте код, который у вас есть, и что вы пробовали. –

+0

Для Java см. Http://www.oracle.com/technetwork/articles/java/json-1973242.html – donlys

+1

@donlys - Но вопрос не в Java – Quentin

ответ

2

Вы можете использовать Map и получить все клиенты первого, а затем раздвигают заказы клиентов.

var object = { orders: [{ idOrder: 1, amount: 100, customerId: 25 }, { idOrder: 2, amount: 200, customerId: 20 }], customers: [{ customerId: 20, name: "John Doe", orders: [] }, { customerId: 25, name: "Mary Jane", orders: [] }] }, 
 
    map = object.customers.reduce((m, a) => m.set(a.customerId, a), new Map); 
 

 
object.orders.forEach(a => map.get(a.customerId).orders.push(a)); 
 

 
console.log(object.customers);

0

Возможное решение:

for (c of customers){ 
    c.orders.push(orders.filter(function(o){ return o.customerId === c.customerId})); 

} 
+0

, это собирается вытолкнуть массив заказов в массив заказчиков. Предполагая, что у клиентов нет заказов, которые вы могли бы выполнить 'c.orders = orders.filter (...' – Scott

0

Если вы думаете о customers качестве аккумулятора можно Reduceorders с customers в качестве начального значения.

Примечание: это делает мутировать customers, если вы не хотите, чтобы это как побочный эффект, который вы должны были бы клонаcustomers. Также не работает обработка ошибок для customerId.

var orders = [{ idOrder: 1, amount: 100, customerId: 25 }, { idOrder: 2, amount: 200, customerId: 20}]; 
 
var customers = [{ customerId: 20, name: "John Doe", orders: [] }, { customerId: 25, name: "Mary Jane", orders: [] } ]; 
 

 
var customers_orders = orders.reduce( 
 
       (accum, v) => 
 
        { accum.find(
 
          c => c.customerId == v.customerId).orders.push(v); 
 
        return accum; 
 
        }, customers); 
 

 
console.log(customers_orders);

0

Вы можете написать функцию и передать его метод сокращения и компоновать его с картой

Just один вещи: как только он создан, он никогда не может измениться. Вы можете использовать Object.assign и concat.

var customersWithOrders = customers.map(function(customer) { 
    var relatedOrders = orders.filter(function(order) { return order.customerId === customer.customerId }) 
    return Object.assign(
    customer, 
    { 
     orders: customer.orders.concat(relatedOrders) 
    } 
) 
})