过滤Javascript对象数组

时间:2014-04-24 10:44:08

标签: javascript jquery

我正在尝试根据其中两个来获取一个新的数组对象。

log1 = {1:"London",2:"New york",4:"Berlin"};
log2 = [{id:1, location:"EU"},{id:2, location:"US"},{id:18, location:"Asia"}];

我想确保log1密钥全部存在于log2中,如果没有,我想删除它。因此,这将是:

 result = {1:"London",2:"New york"};

我无法使用过滤器,因为它只需要一个对象。有没有办法根据两个对象数组进行过滤?有没有巧妙的方法呢?

3 个答案:

答案 0 :(得分:3)

以下是如何在纯js中执行此操作:

    log1 = {1:"London",2:"New york",4:"Berlin"};
    log2 = [{id:1, location:"EU"},{id:2, location:"US"},{id:18, location:"Asia"}];

    for (var prop1 in log1) {
        var found = false;
        for (var i = 0; i < log2.length; i++) {
            if (log2[i].id.toString() === prop1) {
                found = true;
                break;
            }
        }
        if (!found) {
            delete log1[prop1]
        }
    }

答案 1 :(得分:3)

如果您使用的是最新版本的JS Array.map()Array.filter()Object.keys(),您可以尝试使用以下更具功能性的方法:

var log1 = {
    1: "London",
    2: "New york",
    4: "Berlin"
};

var log2 = [
    {id: 1,  location: "EU"},
    {id: 2,  location: "US"},
    {id: 18, location: "Asia"}
];


var ids = log2.map(function(obj) { return obj.id; }).map(String);

Object.keys(log1).filter(function(key) {
    return ids.indexOf(key) === -1;
}).forEach(function(k) {
    delete log1[k];
});

console.log(log1);

应该屈服:

{ '1': 'London', '2': 'New york' }

示例:http://repl.it/RnF/2

希望这会有所帮助:)

修改

否则,对于浏览器兼容性等等,您可以考虑其他海报建议的lodash或下划线。或者使用polyfill!

MDN在旧版环境的以下每个页面的底部提供了polyfill(如果您需要兼容性):

答案 2 :(得分:0)

使用http://underscorejs.org/

它有拔出,过滤和地图功能,可以帮助你..它非常强大..