繁体   English   中英

在比较 postman 中的两个 API 响应时,如何忽略 javascript 中的大小写?

[英]How to ignore case in javascript while comparing two APIs response in postman?

我在下面使用 function 来比较两个 API 响应,但有些键具有相同的值,但大小写不同,它报告的差异是不同的。 如何避免这种区分大小写?

var difference = (object, base) => {
    function changes(object, base) {
        return _.transform(object, function(result, value, key) {
            if(!_.isEqual(value, base[key])) {
                result[key] = (_.isObject(value) && _.isObject(base[key])) ? changes(value, base[key]) : value;
            }
        });
    }
    return changes(object, base);
}

当有任何案例问题时,我希望它不会显示差异。 例如对于下面它不应该返回任何差异并认为它相同

"content": “Data | 8GB
or
"content": “data | 8GB

第一个 API 的响应

[
 {
    "price": 20,
    "planCategory": "Mobile Broadband",
    "externalSkuId": “MBB”,
    "planHeader": {},
    "expiry": "14 days",
    "includedData": 8,
    "includedDataType": "GB",
    "inclusionOption1": "Get 1GB bonus data on every automatic recharge when you opt-in. T&C apply.",
    "inclusionHighlight": "8GB",
    "inclusionOptions": [
      {
        "channels": [
          "SELF_SERVICE",
          "ESTORE"
        ],
        "type": {
          "name": "DATA"
        },
        "content": "data | 8GB"
      },
      {
        "channels": [
          "SELF_SERVICE"
        ],
        "type": {
          "name": "OTHER"
        },
        "content": "expiry|14 days"
      }
    ]
  }
]

第二次 API 响应

[
 {
    "price": 20,
    "planCategory": "Mobile Broadband",
    "externalSkuId": “MBB”,
    "planHeader": {},
    "expiry": "13 days",
    "includedData": 8,
    "includedDataType": "GB",
    "inclusionOption1": "Get 2GB bonus data on every automatic recharge.",
    "inclusionHighlight": "8GB",
    "inclusionOptions": [
      {
        "channels": [
          "SELF_SERVICE",
          "ESTORE"
        ],
        "type": {
          "name": "DATA"
        },
        "content": “Data | 8GB"
      },
      {
        "channels": [
          "SELF_SERVICE"
        ],
        "type": {
          "name": "OTHER"
        },
        "content": “Expiry|14 days"
      }
    ]
  }
]

我如何称呼差异 function

//First API response body
var jsonObject1 = pm.globals.get("responseBodyAPI1”);
//Second API response body
var jsonObject2 = JSON.parse(responseBody);
//Call the difference function stored in global variable and pass response body of both APIs in that
var diff = eval(pm.globals.get("difference"))(jsonObject1, jsonObject2); 
//Log the difference of both APIs on Postman console
console.log(diff);

差异 Function Postman 控制台中的结果也显示区分大小写的问题我只是希望它返回空 object 在这种情况下,因为到期或到期和数据或数据是相同的在此处输入图像描述

var jsonObject1 = pm.globals.get("response");

const lowserCase = (obj) => { 
    Object.keys(obj).forEach((key) => {
        if (key == "content"){
        key = key.toLowerCase(); 
        }
    });
};
jsonObject1.forEach(lowserCase);

console.log(jsonObject1)

上面的代码不起作用

您可以将响应作为字符串并比较每个的小写版本:

 function isSame(res1, res2) { return JSON.stringify(res1).toLowerCase() == JSON.stringify(res2).toLowerCase() } console.log( isSame({"DATA": "X"}, {"data": "x"}) )

使用具有sensitivity: 'base' ,这意味着等效字母具有相同的权重。 toLower高效得多。 这是一个非常有效的 object 比较器,它不需要 toLower 或 JSON.stringify 并在属性为字符串时忽略大小写。

 const compareStr = new Intl.Collator(undefined, { sensitivity: 'base' }).compare; const compare = (obj1, obj2) => Array.isArray(obj1)? Array.isArray(obj2) && obj1.length === obj2.length && obj1.every((item, index) => compare(item, obj2[index])): obj1 instanceof Date? obj2 instanceof Date && obj1.getDate() === obj2.getDate(): obj1 && typeof obj1 === 'object'? obj2 && typeof obj2 === 'object' && Object.getOwnPropertyNames(obj1).length === Object.getOwnPropertyNames(obj2).length && Object.getOwnPropertyNames(obj1).every(prop => compare(obj1[prop], obj2[prop])): typeof obj1 === 'string' && typeof obj2 === 'string'? compareStr(obj1, obj2) === 0: obj1 === obj2; console.log(compare({ prop: 'a' }, { prop: 'A' })); console.log(compare(['b'], ['B'])); console.log(compare('a', 'A')); console.log(compare('B', 'b')); console.log(compare('B', 'a')); console.log(compare('Mismatched case', 'MisMatched Case'));

使用下面的仅将 pipe 符号左侧的“内容”转换为小写。

//Change to lower case from left side of | sign for content
jsonObject1.forEach(function(value, index) {
    if (value.inclusionOptions) {
        value.inclusionOptions.forEach(function(value2, index2) {
            var tokens = value2.content.split('|');
            value2.content = tokens[0].toLowerCase() + "|" + tokens[1];
        });
    }
});
console.log(jsonObject1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM