Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何跨多个对象合并数据_Javascript_Node.js_Underscore.js - Fatal编程技术网

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