【问题标题】:NodeJS - Check if JSON contains sub JSONNodeJS - 检查 JSON 是否包含子 JSON
【发布时间】:2017-11-20 08:36:25
【问题描述】:

我有两个 JSON 对象,我想检查其中一个是否包含另一个(Object1 包含 Object2)

两个 JSON 对象都是动态的 - 我不知道这两个对象的结构或属性名称。

例如,Object1 可以如下所示:

{
    "propertyA": "value1",
    "propertyB": "value2",
    "propertyC": {
         "objProp1": "objVal1",
         "objProp2": "objVal2"       
    }
    "propertyD": [
       {
         "arrProp1": "arrVal1",
         "arrProp2": "arrVal2"
       },
       {
         "arrProp1": "arrVal3",
         "arrProp2": "arrVal4",
       }
    ]
}

虽然 Object2 可能是以下之一:

选项1:

{
    "propertyA": "value1",      
    "propertyD": [          
       {           
         "arrProp2": "arrVal4"
       }
    ]
}

选项 2:

{
   "objProp1": "objVal1"
}

【问题讨论】:

  • Option2 将是 trueOption1 将是 false?
  • This 可以帮到你
  • @Roman - 两个选项都应该为真

标签: javascript json node.js


【解决方案1】:

我希望这段代码能派上用场。我没有太多时间检查所有边缘情况或降低复杂性。

我不确定你到底想的是什么逻辑,因此我为以下条件编写了代码。

  1. 如果您想深入检查 object1 是否包含 object2(object2 中的所有键和值都可以在 object1 中找到),那么此代码可能会对您有所帮助。

function _contains(obj1, obj2) {
    const obj2keys = Object.keys(obj2);

    for (let i = 0; i < obj2keys.length; i++) {
        const key = obj2keys[i];
        if (obj1.hasOwnProperty(key)) {
            if (typeof (obj1[key]) === typeof (obj2[key])) {
                if (typeof (obj1[key]) === 'object') {
                    if (Object.keys(obj1[key]).length !== Object.keys(obj2[key]).length)
                        return false;
                    const res = _contains(obj1[key], obj2[key])
                    if (!res)
                        return false;
                } else {
                    if (obj1[key] !== obj2[key])
                        return false;
                }
            } else {
                return false;
            }
        } else
            return false;
    }
    return true;
}

function contains(object1, object2) {
    let res = false;
    res = _contains(object1, object2);
    const keys = Object.keys(object1);
    for (let index = 0; index < keys.length; index++) {
        const key = keys[index];
        if (res)
            return res;
        else if (typeof (object1[key]) === 'object') {
            res = contains(object1[key], object2);
        }
    }
    return res;
}

const object1 = {
    "propertyA": "value1",
    "propertyB": "value2",
    "propertyC": {
        "objProp1": "objVal1",
        "objProp2": "objVal2"
    },
    "propertyD": [{
            "arrProp1": "arrVal1",
            "arrProp2": "arrVal2"
        },
        {
            "arrProp1": "arrVal3",
            "arrProp2": "arrVal4",
        }
    ]
}

const object2 = {
    "propertyA": "value1",      
    "propertyD": [          
       {           
         "arrProp2": "arrVal4"
       }
    ]
}

console.log(contains(object1, object2));
  1. 如果您只需要检查密钥,那么下面的代码就足够了。

function containsKeys(object1,object2){
    let contains =true;
    const object1Keys = Object.keys(object1);
    const object2Keys = Object.keys(object2);

    for (let index = 0; index < object2Keys.length; index++) {
        const key = object2Keys[index];
        if(!object1.hasOwnProperty(key)){
            contains = false;   
        }
    }
    return contains;
}

const object1 = {
    "propertyA": "value1",
    "propertyB": "value2",
    "propertyC": {
        "objProp1": "objVal1",
        "objProp2": "objVal2"
    },
    "propertyD": [{
            "arrProp1": "arrVal1",
            "arrProp2": "arrVal2"
        },
        {
            "arrProp1": "arrVal3",
            "arrProp2": "arrVal4",
        }
    ]
}

const object2 = {
    "propertyA": "value1",      
    "propertyD": [          
       {           
         "arrProp2": "arrVal4"
       }
    ]
}

console.log(containsKeys(object1, object2));

【讨论】:

    猜你喜欢
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2019-09-21
    • 1970-01-01
    • 2016-03-05
    • 2018-02-13
    • 1970-01-01
    相关资源
    最近更新 更多