有没有更好的方法来替换我的double forEach方法?

时间:2018-05-04 12:54:07

标签: javascript foreach

我有两个列表,如下:

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 个答案:

答案 0 :(得分:2)

您可以在reduce数组上使用a方法,在filter数组上使用内部使用b方法返回belong_type等于当前元素的对象减少。

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)

您还可以在reduce中使用Object.assign方法将其写为单行。

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)