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

Making one to many relation array in JavaScript

我有两个对象数组:

var a = [{
  "id": 1,
  "name": "q"
},
{
  "id": 2,
  "name": "l"
}]

另一个是

var b = [{
  "id": 3,
  "sub": 1,
  "name": "ni"
},
{
  "id": 4,
  "sub": 2,
  "name": "bh"
}]

这里sub是a

中的id

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

var c = [
  {
    "id":1,
    "name":"q",
    "map":[
      {
        "id":3,
        "name":"ni"
      }
    ]
  },
  {
    "id":2,
    "name":"l",
    "map":[
      {
        "id":4,
        "name":"bh"
      }
    ]
  }
]

我如何在 JavaScript 中做到这一点?

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

您可以借助 map 函数完成此操作,然后使用 find 函数从另一个数组中搜索数据。

var b = [{
    "id": 3,
    "sub": 1,
    "name": "ni"
}, {
    "id": 4,
    "sub": 2,
    "name": "bh"
}];
var a = [{
    "id": 1,
    "name": "q"
}, {
    "id": 2,
    "name": "l"
}];

var final = _.map(b, function(d) {
    return {
        id: d.name,
        name: d.name,
        map: _.find(a, function(adata) {
            return adata.id == d.sub; //use underscore find to get the relevant data from array a
        })
    }
});

console.log(final);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

在普通 Javascript 中,您可以使用 Array#map, Array#forEach 和散列 table。

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

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