删除对象数组中的空对象键

时间:2015-09-27 10:07:10

标签: javascript arrays object key

我试图创建一个总结另一个数组的数组。我已经收到了一些非常好的想法here,所有这些想法都在发挥作用,但所有这些想法都会产生另一个障碍,而我似乎无法解决这个问题。

基于@ kooiinc' answer,我目前的代码如下:

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 = [];
grants.map(
function (v) {
    if (!(v.id in this)) {
        this[v.id] = v;
        projects.push(v);
    } else {
        var current = this[v.id];
        current.type = [v.type].concat(current.type);
        current.funds = [v.funds].concat(current.funds);
    }
}, {});

...它给出了以下所需的结果(typefunds加入子数组,其余的被推送不变):

[
    { "id": "p_1", "location": "loc_1", "type": "A", "funds": "5000" },
    { "id": "p_2", "location": "loc_2", "type": ["E","D","B"], "funds": ["3000","1000","2000"] },
    { "id": "p_3", "location": "loc_3", "type": "C", "funds": "500" }
]

但是,如果某些对象具有一些未定义的键值,则结果将在数组中具有空值。例如像这样(查看type数组):

[
    { "id": "p_1", "location": "loc_1", "type": "A", "funds": "5000" },
    { "id": "p_2", "location": "loc_2", "type": ["E",null,null], "funds": ["3000","1000","2000"] },
    { "id": "p_3", "location": "loc_3", "type": "C", "funds": "500" }
]

(这里是fiddle同样的事情。)

我试图找到一种快速删除这些内容的方法(如herehere)但由于某种原因没有通常的方法(递归删除所有未定义的键) / null)似乎工作,无论我把它们放在我的代码中的哪个位置。他们不会犯错,他们只是不会删除任何东西。

是否可能已经以某种方式排除了映射中未定义的键?

更新:因此,某些对象键不会有任何值,只有[null,null,null],而其他对象键会有一些但不是全部["E",null,null]。我们的想法是删除所有空项,如果没有任何内容,则删除对象密钥。

2 个答案:

答案 0 :(得分:2)

以这种方式尝试:

Node

现在结果中不会显示空值。

答案 1 :(得分:0)

我认为您可以测试typefunds属性的出现,并且只有在存在时才会测试,然后插入或更新元素。

a.type && a.funds && ...



var grants = [
        { id: "p_1", location: "loc_1", type: "A", funds: "5000" },
        { id: "p_2", location: "loc_2", funds: "2000" },
        { id: "p_3", location: "loc_3", type: "C", funds: "500" },
        { id: "p_2", location: "_ibid", funds: "1000" },
        { id: "p_2", location: "_ibid", type: "E", funds: "3000" }
    ],
    project = [];

grants.forEach(function (a) {
    a.type && a.funds && !project.some(function (b, i) {
        if (a.id === b.id) {
            project[i].type.push(a.type);
            project[i].funds.push(a.funds);
            return true;
        }
    }) && project.push({ id: a.id, location: a.location, type: [a.type], funds: [a.funds] });
});
document.write('<pre>' + JSON.stringify(project, 0, 4) + '</pre>');
&#13;
&#13;
&#13;