代码之家  ›  专栏  ›  技术社区  ›  Andy

验证json以确保所有数组属性值都是相同的对象类型

  •  0
  • Andy  · 技术社区  · 6 年前

    我需要验证json以确保如果任何属性值是array类型,那么它必须具有相同的对象类型。

    例如,考虑下面这个应该接受的有效json示例

    {
        "key1": "val_1",
        "key_2": [{
            "a": "b"
        }, {
            "c": "d"
        }]
    }
    

    以下是无效的json:

    {
        "key1": "val_1",
        "key_2": [{
            "a": "b"
        }, {
            "c": "d"
        }, {
            "f": 1
        }]
    }
    

    因为 {"f": 1} 与前两个节点不同。前两个节点 一串 价值类型和 “F” 属性值为 数字的 ……因此应该拒绝。

    我应该能够以这种方式检查和验证json中的任何数组属性。

    在客户端javascript上实现这一点的最佳方法是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Rylee    6 年前

    比较对象数组的函数,返回所选类型的所有值

    function returnTypeMatched(arr,type){
        var r = [];
        if(type === undefined){type = 'String';}
        for(var i=0,ilen=arr.length;i<ilen;i++){
            var o = {},
                item = arr[i],
                keys = Object.keys(item);
            for(var j=0,jlen=keys.length;j<jlen;j++){
                var key = keys[j],
                    value = item[key];
                if(arr[i][keys[j]].constructor.name === type){
                    o[key] = value;
                }
            }
            if(Object.keys(o).length > 0){r.push(o);}
        }
        return r;
    }
    

    对你来说

    var myObject = {
            "key1": "val_1",
            "key_2": [{
                "a": "b"
            }, {
                "c": "d"
            }, {
                "f": 1
            }]
        },
        myKeys = Object.keys(myObject);
    
    for(var i=0,ilen=myKeys.length;i<ilen;i++){
        var key = myKeys[i],
            value = myObject[key];
        if(value.constructor.name === 'Array'){
            var firstKeyType = value[0][Object.keys(value[0])[0]].constructor.name;
            myObject[key] = returnTypeMatched(value,firstKeyType);
        }
    }
    
    console.log(myObject);
    /* Returns
    {
        "key1": "val_1",
        "key_2": [{
            "a": "b"
        }, {
            "c": "d"
        }]
    }
    */