我有一个对象数组(来自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
相同时,将合并对象并将它们的一些关键值(在示例中为type
和funds
)组合成一个简单的子数组。合并对象中的其他键(location
)从第一个实例继承值并忽略其余部分。
经过多次失败尝试和大量在线搜索后,我从这个答案中得到了一个想法,以以下方式循环遍历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>