【发布时间】:2015-12-24 03:21:12
【问题描述】:
我有一个对象数组(来自 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) 继承第一个实例的值并忽略其余部分。
经过几次失败的尝试和大量的在线搜索,我从this answer 得到了一个想法,像这样循环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>
【问题讨论】:
标签: javascript arrays object multidimensional-array