2016-05-10 9 views
0

Hallo, ich habe folgendes:merge und hinzufügen, JavaScript-Objekte

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

Dies ist falsch, wie ich zwei { sku: 'EP01', qty: 100, cntry: 'DE' } wo, wie Ich mag würde eine fusionierte Objekt wie { sku: 'EP01', total: 110, qty-gb: 10, qty-de: 100 }

Meine Liste über bekommen hat 8.000 Einträge und in einigen Fällen kann der eine vorhanden sein, aber nicht der andere.

Was ist ein effizienter Weg, dies auf node.js mit lodash zu erreichen?

habe ich versucht, dies:

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 

aber falscher

+0

Welche lodash Combos hast du probiert? – Clarkie

Antwort

1

Hinweis bin: Ich weiß nicht, wie Sie den Code unten zu ändern, um coffreescript so werde ich dies nur in Javascript beantworten.

Sie können folgendes tun:

  1. Verwenden groupBy() gruppieren Artikel von sku.
  2. map() die gruppierten Elemente und geben Sie die transformierten qty Schlüssel nach Land durch reduce() und total Wert durch sumBy().

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

Eine Lösung in Klar Javascript mit einem Objekt als Bezug auf die Elemente der eingefügten Objekte.

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

Da Sie auf Knoten alle ES6 Leckereien sind für Sie da. Also würde ich keine zusätzlichen Bibliotheken wie lodash oder Unterstriche verwenden. Sie tun können, wie diese

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

Falls Sie Zweifel haben, wie alle Duplikate auftreten können, ist es immer am besten, einen Filter am Ende der Kette anzuwenden. Ich werde das auch umsetzen.