2015-11-07 80 views
0

我在node.js中有2個數組;從這兩個其他數組生成這個數組

var alerts_arr = 
[ 
    { 
     "Name": "XXX", "symbol": "XXX.SI", "relationship": ">=", "price_alert": 3, "Remarks": "" 
    }, 
    { 
     "Name": "YYY", "symbol": "YYY.SX", "relationship": ">=", "price_alert": 2.21, "Remarks": "" 
    } 
]; 

var results_arr = 
    [ 
     { 
      "symbol": "XXX", "name": "XXX.SI", "lastDate": "2015-11-05T16:00:00.000Z", "lastPriceOnly": 3.05 
     } 
     , 
     { 
      "symbol": "YYY", "name": "YYY.SX", "lastDate": "2015-11-05T16:00:00.000Z", "lastPriceOnly": 2.2 
     } 
    ]; 

我想結合這兩個數組,使結果看起來像這樣;

var combine_arr = 
    [ 
     { 
      "Name": "XXX", 
      "symbol": "XXX.SI", 
      "relationship": ">=", 
      "price_alert": 3, 
      "Remarks": "", 
      "lastDate": "2015-11-05T16:00:00.000Z", 
      "lastPriceOnly": 3.05 
     }, 
     { 
      "Name": "YYY", 
      "symbol": "YYY.SX", 
      "relationship": ">=", 
      "price_alert": 2.21, 
      "Remarks": "", 
      "lastDate": "2015-11-05T16:00:00.000Z", 
      "lastPriceOnly": 2.2 
     } 
    ] 
; 

這怎麼能在node.js或javascript中完成?

我最初嘗試了var finalObj = alerts_arr.concat(results_arr);,但結果相當糟糕。

+0

這不是[JSON(http://json.org)。那些是簡單的物體。 – Andreas

+0

@ RokoC.Buljan - 在'var alerts_arr = [...'etc - 嘗試JSON.parse,你會發現它是** NOT ** JSON –

+0

@ RokoC.Buljan JSON是一個對象的字符串表示,因此首字母縮寫詞 – Andreas

回答

1
var _ = require('lodash'); 


var alerts_arr = 
[ 
{ 
    "Name": "XXX", "symbol": "XXX.SI", "relationship": ">=", "price_alert": 3, "Remarks": "" 
}, 
{ 
    "Name": "YYY", "symbol": "YYY.SX", "relationship": ">=", "price_alert": 2.21, "Remarks": "" 
} 
]; 

var results_arr = 
[ 
{ 
    "symbol": "XXX", "name": "XXX.SI", "lastDate": "2015-11-05T16:00:00.000Z", "lastPriceOnly": 3.05 
} 
, 
{ 
    "symbol": "YYY", "name": "YYY.SX", "lastDate": "2015-11-05T16:00:00.000Z", "lastPriceOnly": 2.2 
} 
]; 


var transformed_arr = alerts_arr.map(function(item) { 
    var obj = {}; 
    Object.keys(item).forEach(function(key) { 
    if(key === 'Name') { 
     obj['symbol'] = item[key]; 
    } else if(key === 'symbol') { 
     obj['name'] = item[key]; 
    } else { 
     obj[key] = item[key]; 
    } 
    }); 
    return obj; 
}); 

var result = _.merge(transformed_arr, results_arr); 
  1. 改造alerts_arr匹配results_arr,
  2. 然後使用lodashmerge合併兩個數組
+0

我可以問'alerts_arr'轉換成與results_arr'匹配的方式嗎?爲什麼在合併之前需要匹配? – user781486

+1

,因爲results_arr中的'name'是alters_arr中的'symbol',這就是爲什麼我需要轉換 – Sean

3

假設值是唯一的和符號< - >名稱是關鍵,這裏的快速樣品(無錯誤處理):

var combine_arr = []; 

// Transform to associative array for faster fetching 
var transformed_results = results_arr.reduce(function(previous, current) { 
    previous[current.name] = current; 
    return previous; 
}, {}); 

for (var i = 0; i < alerts_arr.length; i++) { 
    var alert = alerts_arr[i]; 

    combine_arr.push({ 
     Name: alert.Name, 
     symbol: alert.symbol, 
     relationship: alert.relationship, 
     price_alert: alert.price_alert, 
     Remarks: alert.Remarks, 
     lastDate: transformed_results[alert.symbol].lastDate, 
     lastPriceOnly: transformed_results[alert.symbol]. lastPriceOnly 
    }); 
} 
1

您還可以使用lodash一行來解決這個:

_.zipWith([ alerts_arr, results_arr ], _.merge)