2016-05-10 8 views
0

こんにちは、私は、次のしているオブジェクトを追加:マージと量はJavascriptを

> var gb = [{"sku": "EP01", "qty": 10, "cntry": "GB"}, {"sku": "EP02", "qty": 5, "cntry": "GB"}, {"sku": "EP03", "qty": 15, "cntry": "GB"}]; 
> 
> var de = [{"sku": "EP01", "qty": 100, "cntry": "DE"}, {"sku": "EP02", "qty": 25, "cntry": "DE"}]; 
> var obj1 = gb.concat(de); 
[ { sku: 'EP01', qty: 100, cntry: 'DE' }, 
    { sku: 'EP02', qty: 25, cntry: 'DE' }, 
    { sku: 'EP03', qty: 15, cntry: 'GB' }, 
    { sku: 'EP01', qty: 100, cntry: 'DE' }, 
    { sku: 'EP02', qty: 25, cntry: 'DE' } ] 
> 

これは私が得るとして間違っている2 { sku: 'EP01', qty: 100, cntry: 'DE' }私は1つのマージされたオブジェクト{ sku: 'EP01', total: 110, qty-gb: 10, qty-de: 100 }

のように取得したいと私のリストを約持っていますいくつかのケースでは1つに存在するかもしれないが、もう1つは存在しないかもしれない。

lodashでnode.jsでこれを達成する効率的な方法は何ですか?

私はこの試みた:

allStockAPI = exports.allStockAPI = (req) -> 
    Promise.props 
    stocksAPI: stockAPI(req) 
    germanStocks: germanStocks.getStocks(config.germanStocksUrl) 
    .then (result) -> 
    newDe = result.germanStocks.map (i) -> 
     return Object.values(i) 
    result.stocksAPI.forEach (i) -> 
     i.pop() 

    rows = result.stocksAPI.concat newDe 
    #console.log rows 
    skus = rows.map (row) -> 
     { 
     sku: row[0], 
     val: row 
     } 
    groupedRows = _(skus).groupBy('sku').value() 
    rows = _(Object.keys(groupedRows)).uniq().value().map (sku) -> 
     rows = groupedRows[sku].map (row) -> 
     row.val 
     rows = rows.map (row) -> 
     if row[row.length - 2] 
      row[row.length - 2] = row[row.length - 1] + ' office : ' + row[row.length - 2] 
     if row[row.length - 2] == null 
      row[row.length - 2] = '' 
     row 

     stock = rows.reduce (prev, cur) -> 
     prev[prev.length - 1] = 'UK/DE' 
     if (prev[prev.length - 2]) 
      prev[prev.length - 2] = prev[prev.length - 2] + '<br>' + cur[prev.length - 2] 
     else 
      prev[prev.length - 2] = cur[prev.length - 2] 
     prev 
     stock 
    rows 

をしかし

+0

試したことがあるロダシコンボは何ですか? – Clarkie

答えて

1

注間違っている:私はので、私はちょうどこれをJavaScriptでお答えしますcoffreescriptするために、次のコードを変更する方法がわかりません。

は、次の操作を行うことができます。

  1. 使用groupBy()skuでグループ項目へ。
  2. map()これらのグループ化されたアイテムは、reduce()totalからsumBy()までの国によって変換されたqty鍵を返します。挿入されたオブジェクトの要素を基準として物体と平野JavaScriptで

var gb = [{"sku": "EP01", "qty": 10, "cntry": "GB"}, {"sku": "EP02", "qty": 5, "cntry": "GB"}, {"sku": "EP03", "qty": 15, "cntry": "GB"}]; 
 

 
var de = [{"sku": "EP01", "qty": 100, "cntry": "DE"}, {"sku": "EP02", "qty": 25, "cntry": "DE"}]; 
 

 
var result = _(gb) 
 
    .concat(de) 
 
    .groupBy('sku') 
 
    .map(function(items) { 
 
    return _.reduce(items, function(acc, item) { 
 
     return _(item) 
 
     .omit(['qty', 'cntry']) 
 
     .set('qty-' + item.cntry, item.qty) 
 
     .assign(acc) 
 
     .value(); 
 
    }, { total: _.sumBy(items, 'qty') }); 
 
    }) 
 
    .value(); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>

0

溶液。

var gb = [{ "sku": "EP01", "qty": 10, "cntry": "GB" }, { "sku": "EP02", "qty": 5, "cntry": "GB" }, { "sku": "EP03", "qty": 15, "cntry": "GB" }], 
 
    de = [{ "sku": "EP01", "qty": 100, "cntry": "DE" }, { "sku": "EP02", "qty": 25, "cntry": "DE" }], 
 
    result = function (data) { 
 
     function update(a) { 
 
      if (!hash[a.sku]) { 
 
       hash[a.sku] = { sku: a.sku, total: 0 }; 
 
       r.push(hash[a.sku]); 
 
      } 
 
      hash[a.sku]['qty-' + a.cntry.toLowerCase()] = a.qty; 
 
      hash[a.sku].total += a.qty; 
 
     } 
 

 
     var hash = Object.create(null), 
 
      r = []; 
 

 
     data.forEach(a => a.forEach(update)); 
 
     return r; 
 
    }([gb, de]); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

0

あなたがノード上にあるので、すべてのES6グッズは、あなたのサービスです。だから、私はロダッシュやアンダースコアのような余分なライブラリを使用しないだろう。あなたが任意の重複のような疑問が発生する可能性があります持っている場合は、この

var gb = [{"sku": "EP01", "qty": 10, "cntry": "GB"}, {"sku": "EP02", "qty": 5, "cntry": "GB"}, {"sku": "EP03", "qty": 15, "cntry": "GB"}], 
 
    de = [{"sku": "EP01", "qty": 100, "cntry": "DE"}, {"sku": "EP02", "qty": 25, "cntry": "DE"}]; 
 
merged = (...arrs) => arrs.reduce((p,c) => c.reduce((f,s) => f.concat(s),p),[]); 
 
document.write("<pre>" + JSON.stringify(merged(gb,de),null,2) + "</pre>");

のように行うことができ、それはチェーンの最後にフィルタを適用するために常に最善です。私はその1つを実装します。

関連する問題