javascript使用forEach合并两个数组

时间:2017-11-23 03:12:33

标签: javascript arrays foreach

我想基于两组数组构建一个新数组。我目前的尝试是:

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

预期结果是:

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

有人可以帮我实现这个目标吗? 我很困惑,无法获得正确的数组结构。

2 个答案:

答案 0 :(得分:2)

我认为你错过了申报变量的正确位置:

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

答案 1 :(得分:1)

为什么我们不尝试使用.map().reduce()以及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);