JSON.stringify使用嵌套对象进行白名单

Chr*_*ill 5 javascript json whitelist

给出以下示例:

var test = {
    "company_name": "Foobar",
    "example": "HelloWorld",
    "address": {
        "street": "My Street 12",
        "example": "BarFoo",
        "details": "Berlin",
    }
}

console.log(JSON.stringify(test, ['company_name','address','street','example']));

// What I actually want
// console.log(JSON.stringify(test, ['company_name','address.street','address.example']));
Run Code Online (Sandbox Code Playgroud)

如何使用JSON的stringify函数正确处理嵌套对象?

由于我有巨大的JSON对象,因此嵌套对象的键与它的"父"对象相同.我想更明确地指定我的白名单.

pic*_*ypg 3

如果您愿意付出白名单的努力,那么您可以建立一个有效键数组,它可以提供类似于多少个系统进行 JSON 嵌套的嵌套能力(分隔符或.您选择的任何分隔符)。

var whitelistedObj = whitelistJson(obj, ["company_name", "example", "address.street", "address.example"]);

function whitelistJson(obj, whitelist, separator) {
    var object = {};

    for (var i = 0, length = whitelist.length; i < length; ++i) {
        var k = 0,
            names = whitelist[i].split(separator || '.'),
            value = obj,
            name,
            count = names.length - 1,
            ref = object,
            exists = true;

        // fill in any empty objects from first name to end without
        //  picking up neighboring fields
        while (k < count) { // walks to n - 1
            name = names[k++];
            value = value[name];

            if (typeof value !== 'undefined') {
                if (typeof object[name] === 'undefined') {
                    ref[name] = {};
                }

                ref = ref[name];
            }
            else {
                exists = false;
                break;
            }
        }

        if (exists) {
            ref[names[count]] = value[names[count]];
        }
    }

    return object;
}
Run Code Online (Sandbox Code Playgroud)

我有一个JSFiddle也显示了它的用法(以确保它确实适用于我公认的小样本集)。