代码之家  ›  专栏  ›  技术社区  ›  qg_java_17137

有没有更好的方法来取代我的double-forEach方法?

  •  1
  • qg_java_17137  · 技术社区  · 8 年前

    我有两个清单,如下所示:

    var a = ["a", "b"]
    
    var b = [{name:"a1", belong_type:"a" }, {name:"a2", belong_type:"a" }, {name:"b1", belong_type:"b" },]
    

    我想这样说:

    var data = {}
    
    
    a.forEach(a_item => {
      data[a_item] = []
      b.forEach(b_item => {
        if (a_item === b_item.belong_type){
          data[a_item].push(b_item)
        }
      })
    })
    
    console.log(data)
    

    结果是:

    { a: 
       [ { name: 'a1', belong_task_type: 'a' },
         { name: 'a2', belong_task_type: 'a' } ],
      b: [ { name: 'b1', belong_task_type: 'b' } ] }
    

    我想我的方法是用两个 forEach ,我不知道是否有更好的方法来实现这个结果,谁能告诉我是否有更好的方法?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Nenad Vracar    8 年前

    你可以使用 reduce 方法打开 a 阵列和内部使用 filter 方法打开 b 返回对象的数组,其中 belong_type 等于reduce中的当前元素。

    var a = ["a", "b"]
    var b = [{name:"a1", belong_type:"a" }, {name:"a2", belong_type:"a" }, {name:"b1", belong_type:"b" }]
    
    const result = a.reduce((r, e) => {
      r[e] = b.filter(({belong_type}) => belong_type == e)
      return r;
    }, {})
    
    console.log(result)

    你也可以使用 Object.assign 方法内部reduce将其编写为一行程序。

    var a = ["a", "b"]
    var b = [{name:"a1", belong_type:"a" }, {name:"a2", belong_type:"a" }, {name:"b1", belong_type:"b" }]
    
    const result = a.reduce((r, e) => Object.assign(r, {[e]: b.filter(({belong_type}) => belong_type == e)}), {})
    console.log(result)