Как сравнить два объекта JSON, исключая поля, указанные в отдельном массиве? (Скрипт почтальона) - PullRequest
0 голосов
/ 31 октября 2018

У меня есть два объекта JSON, один из которых является входным, а другой - выходным. Я хочу проверить, совпадают ли выходные данные с входными данными, которые я указал для ввода вместе с ключом и значением, а также не должны сравниваться для полей, которые я указал в массив исключений.

Json Object1:(input)
{
    "name": "Sonu",
    "city": "NewYork",
    "Amount": 5000,
    "mode": "Weekly",
    "duration": "15",
    "createdCanvasAgentId": 2,
    "isActive": 1
}
Json Object2:(output)
{
    "id": 53,
    "name": "Sonu",
    "city": "NewYork",
    "Amount": 5000,
    "mode": "Weekly",
    "duration": "15",
    "qty": null,
    "createdCanvasAgentId": 2,
    "isActive": true
}

Поля, которые я должен игнорировать, когда сравнение выполняется в массиве 'exclude'

exclude = {"id","qty","isActive"}

Фрагмент кода выглядит следующим образом:

//Input 
var en_val = pm.environment.get("my_array");
console.log(en_val);

keysave = Object.keys(JSON.parse(en_val));
console.log(keysave);

valuesave=Object.values(JSON.parse(en_val));
console.log(valuesave);

// Output
var resdata = JSON.parse(responseBody);
console.log(resdata);

keylist = Object.keys(resdata.data.list[0]);
console.log(keylist);

valuelist =Object.values(resdata.data.list[0]);
console.log(valuelist);

// exclude contains array of values that need not be compared
var ex=pm.environment.get("exclude");
var excludeKeys = Object.keys(JSON.parse(ex));

Ответы [ 5 ]

0 голосов
/ 05 ноября 2018
Json Object 1: keysave,valuesave
Json Object 2: keylist,valuelist
//values that aren't need to be checked
exclude = ["id","qty","isActive"]

Код:

 var ex1=pm.environment.get("exclude");
    var resp=[];
    for (var i in keysave)
     {    
        console.log(keysave[i]);    
        if(ex1.indexOf(keysave[i]) < 0)   
        {           
            var flag =0;        
            for (var j in keylist) 
            {       
                if(keylist[j] === keysave[i] && valuelist[j] === valuesave[i])
                {           
                    flag = 0;           
                    break;      
                }       
                else 
                {                       
                    flag = 1;

                }   
            }           
            if(flag === 0)
            {       
                console.log("Matched value "+keysave[i]);   
            }   
            else 
            {       
                console.log("None matched value "+keysave[i]);  
                resp.push(keysave[i])       
                console.log(resp);  
            }       
        }
    }
    if(resp.length > 0)
    {    
        tests[resp] = false;
    }
    else
    {    
        tests['Both JSON are Equal'] = true;
    }
0 голосов
/ 31 октября 2018

Вы должны написать функцию для преобразования исходных объектов во временные объекты, а затем сравнить их.

function convertToObjectWithExcludeKeys(orginalObject, excludeKeys){
    var newObj = {};
    Object.keys(orginalObject).map(key => {
      if(excludeKeys.indexOf(key) < 0){
        newObj[key] = orginalObject[key];  
      }

    })
    return newObj;
}


var b = {
    "id": 51,
    "name": "Sonsssu",
    "city": "NewYork",
    "Amount": 5000,
    "mode": "Weekly",
    "duration": "15",
    "qty": null,
    "createdCanvasAgentId": 2,
    "isActive": true
};
var a = {
    "name": "Sonu",
    "city": "NewYork",
    "Amount": 5000,
    "mode": "Weekly",
    "duration": "15",
    "createdCanvasAgentId": 2,
    "isActive": 1
};

var excludeKeys = ["id","qty","isActive"];

//Convert original objects to temporary objects with exclude keys
var tmpA = convertToObjectWithExcludeKeys(a, excludeKeys);
var tmpB = convertToObjectWithExcludeKeys(b, excludeKeys);

console.log("tmpA", tmpA);
console.log("tmpB", tmpB);

//Then compare them .....
0 голосов
/ 31 октября 2018

Может быть, вы можете использовать метод _.isEqual из lodash?

Этот метод _.isEqual вернет true, если оба они одинаковы. И что касается исключающей части, я полагаю, что вы можете передать функцию в качестве третьего параметра во время вызова, который будет выполнять проверку, чтобы игнорировать свойство, которое вы хотите игнорировать. И я предлагаю вам использовать _.includes для обработки проверки внутри функции. Надеюсь, что это помогает ..

Спасибо.

[https://lodash.com/docs/4.17.10#isEqual] [https://lodash.com/docs/4.17.10#includes]

0 голосов
/ 31 октября 2018

Пользовательская реализация сравнения двух объектов с ключами для исключения.

var b = {
    "id": 51,
    "name": "Sonsssu",
    "city": "NewYork",
    "Amount": 5000,
    "mode": "Weekly",
    "duration": "15",
    "qty": null,
    "createdCanvasAgentId": 2,
    "isActive": true
};
var a = {
    "name": "Sonu",
    "city": "NewYork",
    "Amount": 5000,
    "mode": "Weekly",
    "duration": "15",
    "createdCanvasAgentId": 2,
    "isActive": 1
};
var exclude = ["id","qty","isActive"];

function compareObject(first, second,excludeKeys) {
    var excludes = {};
    var isSame = true;
    if(excludeKeys) {
        excludeKeys.forEach(function (key) {
            if (!excludes.hasOwnProperty(key)) {
                excludes[key] = 1;
            }
        });
    }
    Object.keys(first).forEach(function (key) {
        if(!excludes.hasOwnProperty(key)){
            if(first[key] !== second[key]){
                isSame = false;
            }
        }
    });
    return isSame;
}

console.log(compareObject(a,b.exclude));
0 голосов
/ 31 октября 2018

Вы можете воспользоваться вторым аргументом в JSON.parse(text, reviver)

reviver - Если функция, это предписывает, как значение, первоначально произведенное при синтаксическом анализе, преобразуется перед возвратом.

Кроме того, вы должны воспользоваться встроенными помощниками lodash.

Вот полный пример теста в Почтальоне

const original = {
    city: 'New York'
}

const json = '{"id":10,"city":"New York","qty":5}'
const exclude = ['id', 'qty']
const reviverFilter = (k, v) => exclude.includes(k) ? undefined : v
const expected = JSON.parse(json, reviverFilter)

pm.test('Equals', function() {
    pm.expect(_.isEqual(original, expected)).to.be.true
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...