简体   繁体   中英

Generate Array of Objects of different Objects Javascript

I have severel Objects containing one sort of data: Prices:

'btc-usd' : 2640, 'ltc-usd': 40, ...

Amount of Crypto:

'btc-usd': 2.533, 'ltc-usd': 10.42, ...

How can I take these Objects and create an Array of Objects like:

[ { name: 'Bitcoin', amount: 2.533, value: 2640, id: 'btc-usd' },
 { name: 'Litecoin', amount: 10.42, value: 40, id: 'ltc-usd' }, ...
]

Thanks a lot for your help!

You could use a hash map (eg 'btc-usd' => {name:"Bitcoin",...} ) to create new objects. This hashmap can be easily converted to an array.

var input={
  value:{'btc-usd' : 2640, 'ltc-usd': 40},
  amount:{'btc-usd': 2.533, 'ltc-usd': 10.42},
  name:{"btc-usd":"Bitcoin","ltc-usd":"Litecoin"}
};

var hash={};
for(key in input){
   var values=input[key];
   for(id in values){
      if(!hash[id]) hash[id]={id:id};
      hash[id][key]=values[id];
    }
}

var output=Object.values(hash);

http://jsbin.com/fadapafaca/edit?console

Here's a generalized function, add , that accepts a field name and an object of values and maps them into a result object which can then be mapped into an array.

 const amounts = {btc: 123.45, eth: 123.45}; const names = {btc: 'Bitcoin', eth: 'Etherium'}; const result = {}; const add = (field, values) => { Object.keys(values).forEach(key => { // lazy initialize each object in the resultset if (!result[key]) { result[key] = {id: key}; } // insert the data into the field for the key result[key][field] = values[key]; }); } add('amount', amounts); add('name', names); // converts the object of results to an array and logs it console.log(Object.keys(result).map(key => result[key])); 

You could map the keys of one of the objects to produce a new array of objects. You just have to make sure, that the key is in every of these objects.

const names = {
    'btc-usd' : 'Bitcoin', 
    'ltc-usd': 'Litecoin', 
    ...
}

const prices = {
    'btc-usd' : 2640, 
    'ltc-usd': 40, 
    ...
}

const amounts = {
    'btc-usd': 2.533, 
    'ltc-usd': 10.42, 
    ...
}

const cryptos = Object.keys(names).map((key, index) => ({
    name: names[key],
    amount: amounts[key] , 
    value: prices[key]},
    id: key
}));
const prices = {
  'btc-usd' : 2640,
  'ltc-usd': 40
};

const amounts = {
  'btc-usd': 2.533,
  'ltc-usd': 10.42
};

First, create a dictionary of what each abbreviation stands for.

const dictionary = {
  'btc': 'Bitcoin',
  'ltc': 'Litecoin'
};

Then, populate an empty array with objects containing the relevant information. In each of these objects, the name would correspond to the relevant key within the dictionary object. At the same time, the amount and value would correspond to the relevant key within the amounts and prices objects respectively. Finally, the Id would correspond to the key itself.

const money = [];

for(let coin in prices) {
  money.push({
    name: dictionary[coin.substr(0, coin.indexOf('-'))],
    amount: amounts[coin],
    value: prices[coin],
    id: coin
  });
}

console.log(money);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM