为了账号安全,请及时绑定邮箱和手机立即绑定

比较邮递员中的两个 API 响应时如何忽略 javascript 中的大小写?

比较邮递员中的两个 API 响应时如何忽略 javascript 中的大小写?

喵喔喔 2022-12-08 15:51:52
我正在使用下面的函数来比较两个 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 | 8GBor"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"      }    ]  }]
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

将 Intl.Collator 与 一起使用sensitivity: 'base',这意味着等效字母的权重相同。效率比toLower. 这是一个非常高效的对象比较器,它不需要 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'));


查看完整回答
反对 回复 2022-12-08
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

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


//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);


查看完整回答
反对 回复 2022-12-08
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

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


function isSame(res1, res2) {

  return JSON.stringify(res1).toLowerCase() == JSON.stringify(res2).toLowerCase()

}


console.log( isSame({"DATA": "X"}, {"data": "x"}) )


查看完整回答
反对 回复 2022-12-08
  • 3 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号