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项
的值聚合到一个数组中;同时,为了以后的简单起见,将keyterm
的所有值封装在一个数组中。最终结果是:
[ [{ 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”值可能会有所帮助。