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

我正在使用下面的函数来比较两个 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"

      }

    ]

  }

]


喵喔喔
浏览 148回答 3
3回答

慕盖茨4494581

将 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'));

慕的地6264312

使用下面的方法仅将管道符号左侧的“内容”转换为小写。//Change to lower case from left side of | sign for contentjsonObject1.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);

慕桂英4014372

您可以将响应作为字符串并比较每个的小写版本:function isSame(res1, res2) {  return JSON.stringify(res1).toLowerCase() == JSON.stringify(res2).toLowerCase()}console.log( isSame({"DATA": "X"}, {"data": "x"}) )
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript