【问题标题】:Making one to many relation array in JavaScript在 JavaScript 中创建一对多关系数组
【发布时间】:2016-07-29 07:59:07
【问题描述】:

我有两个对象数组:

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 中做到这一点?

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

【问题讨论】:

    标签: javascript arrays ecmascript-6 underscore.js


    【解决方案1】:

    在纯 Javascript 中,您可以使用 Array#mapArray#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);

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

    【讨论】:

    • 在 ES6 代码中,Arrow function should not return assignment 在这一行 result = a.map((hash => a => hash[a.id] = { id: a.id, name: a.name, map: [] })(hash));
    • 您使用哪种浏览器?
    • 我在 Node.js 中这样做
    【解决方案2】:

    您可以在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>

    【讨论】:

    • 他们在map 中键入final 不是对象数组。我需要一个数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2020-07-24
    • 2022-10-25
    相关资源
    最近更新 更多