在 JavaScript 中制作一对多关系数组

nir*_*air 3 javascript arrays underscore.js ecmascript-6

我有两个对象数组:

var a = [{
  "id": 1,
  "name": "q"
},
{
  "id": 2,
  "name": "l"
}]
Run Code Online (Sandbox Code Playgroud)

另一个是

var b = [{
  "id": 3,
  "sub": 1,
  "name": "ni"
},
{
  "id": 4,
  "sub": 2,
  "name": "bh"
}]
Run Code Online (Sandbox Code Playgroud)

这里的sub是ida

我需要一个新的数组,如下所示:

var c = [
  {
    "id":1,
    "name":"q",
    "map":[
      {
        "id":3,
        "name":"ni"
      }
    ]
  },
  {
    "id":2,
    "name":"l",
    "map":[
      {
        "id":4,
        "name":"bh"
      }
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 JavaScript 中做到这一点?

我在我的项目中使用下划线。

Nin*_*olz 5

在普通的 Javascript 中,您可以使用Array#map,Array#forEach和哈希表。

var a = [{ "id": 1, "name": "q" }, { "id": 2, "name": "l" }],
    b = [{ "id": 3, "sub": 1, "name": "ni" }, { "id": 4, "sub": 2, "name": "bh" }],
    hash = Object.create(null),
    result = a.map(function (a, i) {
        hash[a.id] = { id: a.id, name: a.name };
        return hash[a.id];
    }, hash);

b.forEach(function (a) {
    hash[a.sub].map = hash[a.sub].map || [];
    hash[a.sub].map.push({ id: a.id, name: a.name });
}, hash);

console.log(result);
Run Code Online (Sandbox Code Playgroud)

ES6

var a = [{ "id": 1, "name": "q" }, { "id": 2, "name": "l" }],
    b = [{ "id": 3, "sub": 1, "name": "ni" }, { "id": 4, "sub": 2, "name": "bh" }],
    hash = Object.create(null),
    result = a.map((hash => a => hash[a.id] = { id: a.id, name: a.name, map: [] })(hash));

b.forEach((hash => a => hash[a.sub].map.push({ id: a.id, name: a.name }))(hash));

console.log(result);
Run Code Online (Sandbox Code Playgroud)