2015-11-07 67 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)