Javascript JS:根据特定键的值重新组织数组中的对象(reduce?)

Javascript JS:根据特定键的值重新组织数组中的对象(reduce?),javascript,arrays,grouping,aggregate,reduce,Javascript,Arrays,Grouping,Aggregate,Reduce,这是一个后续的问题,虽然两者在操作方面是不相关的 从这种结构开始: [ [{ field: "field1", term: "val1"}, { field: "field2", term: "val2"} ], [{ field: "field3", term: "val3"}, { field: "field3", term: "val4"}, { field: "field4", term: "val5"} ], [{ field: "field3",

这是一个后续的问题,虽然两者在操作方面是不相关的


从这种结构开始:

[ [{ field: "field1", term: "val1"},
   { field: "field2", term: "val2"}
  ],
  [{ field: "field3", term: "val3"},
   { field: "field3", term: "val4"},
   { field: "field4", term: "val5"}
  ],
  [{ field: "field3", term: "val6"},
   { field: "field2", term: "val7"},
   { field: "field3", term: "val8"},
   { field: "field1", term: "val9"},
   { field: "field2", term: "val10"}
  ]
]
我需要遍历每个子数组,对于其中的每个对象,当key
字段
相同时,将key
的值聚合到一个数组中;同时,为了以后的简单起见,将key
term
的所有值封装在一个数组中。最终结果是:

[ [{ field: "field1", term: ["val1"]},
   { field: "field2", term: ["val2"]}
  ],
  [{ field: "field3", term: ["val3", "val4"},
   { field: "field4", term: ["val5"]}
  ],
  [{ field: "field3", term: ["val6", "val8"]},
   { field: "field2", term: ["val7", "val10"]},
   { field: "field1", term: ["val9"]}
  ]
]

我试过玩
对每个对象进行reduce,虽然比较接近,但从未完全达到。如果根本不掌握这种模式,我也不相信
reduce
是正确的选择

有什么想法或建议吗?两天来一直想把这个包起来…:


非常感谢,您可以为每个数组创建一个新对象,该对象以“field”值作为键,“term”数组作为值。然后可以将其转换回原始形式的对象

var newArray = array.map(function( subArray ) {
  var obj = subArray.reduce(function(m, o) {
    if (o.field in m)
      m[o.field].push(o.term);
    else
      m[o.field] = [o.term];
    return m;
  }, {});

  return Object.keys(obj).map(function(field) {
    return { field: field, term: obj[field] };
  });
});

非常感谢!工作完全符合预期;我必须弄清楚MapReduce到底是怎么回事;出于某种原因,我还不能完全理解这一点:/@OlivierClément如果您想知道发生了什么,那么
console.log()
中间的“obj”值可能会有所帮助。