【问题标题】:Use Lodash to compare, match and filter two objects使用 Lodash 比较、匹配和过滤两个对象
【发布时间】:2017-03-23 16:35:56
【问题描述】:

我有一个看起来像这样的对象(带有嵌套对象):

var data = {
"results":{  
           "Description":"There was a record added",
           "resultTimestamp":"2017-03-23T21:56:05Z"
        },
"service":"FDSY",
"StartTimestamp":"2017-03-23T21:55:17Z",
"eventId":"033dc019-0b8a-4af22",
"assetId":"TenGigE0/14/0/0.55",
"assetType":"CLCI" 
}

另一个看起来像这样(也带有嵌套对象):

var filter = {
"results":{  
           "Description":"",
        },
"service":"",
"eventId":"",
"assetType":"" 
}

第二个对象代表第一个对象的“过滤条件”。如何使用 lodash 返回如下所示的对象:

var result = {
 "results":{  
     "Description":"There was a record added"
 },
"service":"FDSY",
"eventId":"033dc019-0b8a-4af22",
"assetType":"CLCI" 
}

本质上,我只需要结果是与过滤器对象中的键匹配的键值对。我还需要过滤嵌套对象

我不需要使用 lodash,但我知道它们的许多功能会让这变得简单。 提前谢谢你。

【问题讨论】:

    标签: javascript json object lodash


    【解决方案1】:

    您可以使用过滤器的键,Array#reduce 用于迭代键,Object.assign 用于组装对象。

    var data = { service: "FDSY", StartTimestamp: "2017-03-23T21:55:17Z", eventId: "033dc019-0b8a-4af22", assetId: "TenGigE0/14/0/0.55", assetType: "CLCI" },
        filter = { service: "", eventId: "", assetType: "" },
        result = Object.keys(filter).reduce((r, k) => Object.assign(r, { [k]: data[k] }), {});
    
    console.log(result);

    ES5

    var data = { service: "FDSY", StartTimestamp: "2017-03-23T21:55:17Z", eventId: "033dc019-0b8a-4af22", assetId: "TenGigE0/14/0/0.55", assetType: "CLCI" },
        filter = { service: "", eventId: "", assetType: "" },
        result = Object.keys(filter).reduce(function (r, k) {
            r[k] = data[k];
            return r;
        }, {});
    
    console.log(result);

    对于深层嵌套对象,您可以使用递归方法,并在源对象上使用闭包。

    var data = { results: { Description: "There was a record added", resultTimestamp: "2017-03-23T21:56:05Z", foo: {bar:42} }, service: "FDSY", StartTimestamp: "2017-03-23T21:55:17Z", eventId: "033dc019-0b8a-4af22", assetId: "TenGigE0/14/0/0.55", assetType: "CLCI" },
        filter = { results: { Description: "", foo: { bar: "" } }, service: "", eventId: "", assetType: "" },
        result = Object.keys(filter).reduce(function iter(source) {
            return function (r, k) {
                r[k] = filter[k] && typeof filter[k] === 'object' ?
                    Object.keys(filter[k]).reduce(iter(source[k]), {}) :
                    source[k];
                return r;
            };
        }(data), {});
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 谢谢!这很好用。如果有嵌套对象怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2016-02-24
    相关资源
    最近更新 更多