Javascript 如何跨多个对象合并数据
示例对象:Javascript 如何跨多个对象合并数据,javascript,node.js,underscore.js,Javascript,Node.js,Underscore.js,示例对象: { people: [ { "Name": "Jimmy", "Place": ["USA", "Canada", "United Kingdom"] }, { "Name": "Serena", "Place": ["USA", "Japan", "Canada", "Thailand"] }, { "Name": "Richard", "Place": ["USA", "Japan", "China", "Uni
{
people: [
{
"Name": "Jimmy",
"Place": ["USA", "Canada", "United Kingdom"]
},
{
"Name": "Serena",
"Place": ["USA", "Japan", "Canada", "Thailand"]
},
{
"Name": "Richard",
"Place": ["USA", "Japan", "China", "United Kingdom"]
},
{
"Name": "Rachel",
"Place": ["Germany"]
}
]
}
使用此对象,我需要显示每个地方以及与该地方相关联的名称,如下所示:
USA
Jimmy, Serena, Richard
Canada
Jimmy, Serena
Japan
Serena, Richard
Thailand
Serena
China
Richard
United Kingdom
Jimmy, Richard
Germany
Rachel
这是我目前有限的进展
用我有限的JavaScript经验,我似乎不知道如何做到这一点。使用下划线,我已经知道了如何显示每个人的名字和他们所在的地方,但这不是我想要的。我需要它合并如上所示。这是我到目前为止想到的
_.each(people, function (value, key) {
var name = person[key].Name;
var place = person[key].Place;
return name + '<br>' + place;
});
有人能帮忙吗?我更喜欢使用下划线的答案,但我对其他形式的JavaScript持开放态度。只需解析所有国家的数组并添加匹配的名称即可。两个嵌套循环就足够了:
var arr = [/*...*/];// initial array
// object stores the target structure
var store = {};
// for every person in the list ..
arr.forEach(function(person) {
// for every country, the person has visited
person.Place.forEach(function(place) {
// does the store know the country?
if (!store.hasOwnProperty(place)) {
// no, create it
store[place] = [];
}
// add the person the the country
store[place].push(person.Name);
});
});
console.log(store);
您需要先合并位置,然后循环位置并打印名称(如果匹配):
var _ = require('underscore');
var places = [];
var os = require('os');
var i, j, len, len1, names;
for (i = 0, len = people.length; i < len; i++) {
places = _.union(places, people[i].Place);
}
for (i = 0, len = places.length; i < len; i++) {
console.log(places[i]);
names = []
for (j = 0, len1 = people.length; j < len1; j++) {
if (_.indexOf(people[j].Place, places[i]) >= 0) {
names.push(people[j].Name);
}
}
console.log(" " + names.join(', ') + os.EOL);
}
var\=require('下划线');
var位置=[];
var os=要求(“os”);
变量i,j,len,len1,名称;
for(i=0,len=people.length;i=0){
Name.push(人[j].Name);
}
}
console.log(“+names.join(',')+os.EOL);
}
@Barry Anders:我本可以将0.each()用于所有那些“for”循环,但在这种情况下,仅用于for循环在速度和内存方面更有效
var _ = require('underscore');
var places = [];
var os = require('os');
var i, j, len, len1, names;
for (i = 0, len = people.length; i < len; i++) {
places = _.union(places, people[i].Place);
}
for (i = 0, len = places.length; i < len; i++) {
console.log(places[i]);
names = []
for (j = 0, len1 = people.length; j < len1; j++) {
if (_.indexOf(people[j].Place, places[i]) >= 0) {
names.push(people[j].Name);
}
}
console.log(" " + names.join(', ') + os.EOL);
}