我有一个对象数组(来自 XLSX.js 解析器,因此其长度和内容各不相同),表示已给予项目的资助。
简化后,它看起来像这样:
var grants = [
{ id: "p_1", location: "loc_1", type: "A", funds: "5000" },
{ id: "p_2", location: "loc_2", type: "B", funds: "2000" },
{ id: "p_3", location: "loc_3", type: "C", funds: "500" },
{ id: "p_2", location: "_ibid", type: "D", funds: "1000" },
{ id: "p_2", location: "_ibid", type: "E", funds: "3000" }
];
我需要将它们合并到一个新数组中,如下所示:
var projects = [
{ id: "p_1", location: "loc_1", type: "A", funds: "5000" },
{ id: "p_2", location: "loc_2", type: ["B", "D", "E"], funds: ["2000", "1000", "3000"] },
{ id: "p_3", location: "loc_3", type: "C", funds: "500" }
];
...这样当id
是一样的,它会合并对象并组合some它们的关键值(在示例中type
and funds
) 到一个简单的子数组中。其他键(location
)在这些合并对象中继承第一个实例的值并忽略其余的。
经过几次失败的尝试和大量的网上搜索后,我得到了一个想法这个答案 https://stackoverflow.com/a/27524550/4593394循环通过grants
像这样:
var res = {};
$.each(grants, function (key, value) {
if (!res[value.id]) {
res[value.id] = value;
} else {
res[value.id].type = [res[value.id].type, value.type];
res[value.id].funds = [res[value.id].funds, value.funds];
}
});
var projects = []
projects = $.map( res, function (value) { return value; } );
它实际上工作得很好,除了因为我需要一个数组,所以我删除了.join(',')
从末端(从上面提到的答案),这反过来又造成了我现在似乎无法解决的问题。这子数组相互嵌套不知何故,如果其中至少有三件物品!我有点理解为什么(循环),但我想知道是否有一种方法可以将对象内的所有这些小多维数组转换为单个数组(例如:type: ["B", "D", "E"]
)?
var grants = [
{ id: "p_1", location: "loc_1", type: "A", funds: "5000" },
{ id: "p_2", location: "loc_2", type: "B", funds: "2000" },
{ id: "p_3", location: "loc_3", type: "C", funds: "500" },
{ id: "p_2", location: "_ibid", type: "D", funds: "1000" },
{ id: "p_2", location: "_ibid", type: "E", funds: "3000" }
];
var res = {};
$.each(grants, function (key, value) {
if (!res[value.id]) {
res[value.id] = value;
} else {
res[value.id].type = [res[value.id].type, value.type];
res[value.id].funds = [res[value.id].funds, value.funds];
}
});
var projects = []
projects = $.map( res, function (value) { return value; } );
$("pre").html(JSON.stringify(projects,null,2));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="json"></pre>