2017-02-07 22 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: [] 
    } 
] 

すなわち2つのオブジェクトの配列を持っているとしましょう。それを行うためのきれいな方法はありますか?

私はこれを試してみましたが、明らかにそれはそのように動作しません:

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

ではありません。これは注文の配列をcustomer.orders配列。顧客には何も注文がないと仮定すると、 'c.orders = orders.filter(...' – Scott

0

あなたはアキュムレータとしてcustomersを考える場合は、あなたの初期値としてcustomersReduceordersをすることができます。

注:あなたがクローン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

あなたは、関数を記述し、方法を削減し、マップ

でちょうど1の事、それを構成するためにそれを渡すことができます:それが作成されますと、それは決して変化しないことがあります。ユーザー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) 
    } 
) 
}) 
関連する問題