javascript merge two arrays with forEach

Viewed 5683

I want to construct a new array based on two sets of arrays. My current attempt is:

const mylist = [
            {
                "city" : "aa", 
                "country" : "de"
            },
            {
                "city" : "bb", 
                "country" : "us"
            },
            {
                "city" : "cc", 
                "country" : "ca"
            },
            {
                "city" : "dd", 
                "country" : "za"
            },
            {
                "city" : "ee", 
                "country" : "fr"
            },            
            {
                "city" : "ff", 
                "country" : "gr"
            }                      
        ]


const stats = [{name : 'original', count: 'one'}, {name: 'copy', count: 'two'}, {name: 'redundant', count: 'three'}];

let myFinalList = [];
let str = 'hello.';


mylist.forEach(function (place, nn) {
  let suffix = place.country;
  stats.forEach(function (k) {
    let items = {};
    items[k.name] = str + k.count + '.' + suffix;
    items['city'] = place.city;
    myFinalList.push(items);
  });

}, this);

console.log('print out: ', myFinalList);

the expected result is:

[ { original: 'hello.one.de', copy: 'hello.two.de', redundant: 'hello.three.de', city: 'aa' },
  { original: 'hello.one.us', copy: 'hello.two.us', redundant: 'hello.three.us', city: 'bb' },
  ...
  { original: 'hello.one.gr', copy: 'hello.two.gr', redundant: 'hello.three.gr', city: 'ff' }]

could somebody help me achieve this goal? i am confused and can't get the right array structure.

2 Answers

i think you are missing the right position to declare the variables:

mylist.forEach(function (place, nn) {
  let suffix = place.country;
  let items = {};
  stats.forEach(function (k) {

    items[k.name] = str + k.count + '.' + suffix;

  });
    items['city'] = place.city;
    myFinalList.push(items);
}, this);

Why not we try using .map() and .reduce() and Template literals ?

/* transform every place in mylist ...*/
var finalList = mylist.map(place => {
    /*  1. create a new ITEM object with CITY property set with PLACE.CITY.
        2. for each stat, create a new property in ITEM and set its value with string interpolation..
        3. return ITEM as the transformed object...*/
    return stats.reduce((item, stat) => {
        item[stat.name] = `${str}.${stat.count}.${place.country}`;
        return item;
    }, { city: place.city });
});

var mylist = [
 { city: "aa", country: "de" }, 
 { city: "bb", country: "us" }, 
 { city: "cc", country: "ca" }, 
 { city: "dd", country: "za" }, 
 { city: "ee", country: "fr" }, 
 { city: "ff", country: "gr" }
];

var stats = [
 { name: 'original', count: 'one' }, 
 { name: 'copy', count: 'two' }, 
 { name: 'redundant', count: 'three' }
];

var str = 'hello';
/* transform every place in mylist ...*/
var finalList = mylist.map(place => {
  /*  1. create a new ITEM object with CITY property set with PLACE.CITY.
   2. for each stat, create a new property in ITEM and set its value with string interpolation..
   3. return ITEM as the transformed object...*/
  return stats.reduce((item, stat) => {
   item[stat.name] = `${str}.${stat.count}.${place.country}`;
   return item;
  }, { city: place.city });
 });

console.log('print out: ', finalList);

Related