从复杂的JavaScript对象中删除对象的最佳方法是什么?

时间:2014-11-27 12:05:41

标签: javascript jquery underscore.js lodash

我有一个JavaScript对象,如下所示:

{
    "filters": [
        {
            "name": "Test",
            "items": [
                {
                    "id": 1207700620,
                    "checked": false
                },
                {
                    "id": 1207825584,
                    "checked": false
                },
                {
                    "id": 1207969166,
                    "checked": true
                }
            ]
        },
        {
            "name": "Empty",
            "items": []
        },
        {
            "name": "ThirdList",
            "items": [
                {
                    "id": "1207828314",
                    "checked": true
                },
                {
                    "id": "1236723086",
                    "checked": false
                },
                {
                    "id": "1208005603",
                    "checked": true
                }
            ]
        }
    ]
}

我的object有一个名为filters的数组。该数组包含多个对象。在每个对象中,有一个名为items的数组。对于此items数组中的每个元素,我需要检查checked属性& if it is false, I need to delete that record (that item in items array)

我需要确保IE 8的兼容性

我可以在过滤器数组上使用for循环,在这个for循环中,我可以使用另一个for循环来遍历items数组。我不想要这个apporach。

有没有更聪明的方法来通过lodash或jquery或任何其他JavaScript库实现这一点?

1 个答案:

答案 0 :(得分:2)

您可以尝试forEachfilter方法的组合:

obj.filters.forEach(function(filter) {
    filter.items = filter.items.filter(function(el) {
        return el.checked;
    });
});

检查下面的例子。



var obj = {
    "filters": [
        {
            "name": "Test",
            "items": [
                {
                    "id": 1207700620,
                    "checked": false
                },
                {
                    "id": 1207825584,
                    "checked": false
                },
                {
                    "id": 1207969166,
                    "checked": true
                }
            ]
        },
        {
            "name": "Empty",
            "items": []
        },
        {
            "name": "ThirdList",
            "items": [
                {
                    "id": "1207828314",
                    "checked": true
                },
                {
                    "id": "1236723086",
                    "checked": false
                },
                {
                    "id": "1208005603",
                    "checked": true
                }
            ]
        }
    ]
};

obj.filters.forEach(function(filter) {
    filter.items = filter.items.filter(function(el) {
        return el.checked;
    });
});

alert( JSON.stringify(obj, null, 4) );




对于IE8兼容性,您可以使用polyfill或ES5垫片。

如果你可以使用Underscore / Lo-Dash,另一种选择,你可以使用模拟方法:_.each_.filter而不是Array.prototype.forEachArray.prototype.filter

_.each(obj.filters, function(filter) {
    filter.items = _.filter(filter.items, function(el) {
        return el.checked;
    });
});