Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何比较两个行位置和索引不同的JSON_Javascript_Node.js_Json - Fatal编程技术网

Javascript 如何比较两个行位置和索引不同的JSON

Javascript 如何比较两个行位置和索引不同的JSON,javascript,node.js,json,Javascript,Node.js,Json,我有一个JSON文件,我想比较两个值,确保两个JSON具有相同的值,并返回TRUE。如果有任何一个值不可用,那么我需要立即返回FALSE 问题是现在我有两个JSON文件,它们的值相同,但行位置不同 JSON_1: { "sqlQuery": "select type,subtype from wetrade_p2 where parent_id='69341269'", "message": "2 rows s

我有一个JSON文件,我想比较两个值,确保两个JSON具有相同的值,并返回TRUE。如果有任何一个值不可用,那么我需要立即返回FALSE

问题是现在我有两个JSON文件,它们的值相同,但行位置不同

JSON_1:

{
    "sqlQuery": "select type,subtype from wetrade_p2 where parent_id='69341269'",
    "message": "2 rows selected",
    "row": [
        {
            "column": [
                {
                    "value": "W",
                    "name": "TYPE"
                },
                {
                    "value": "P",
                    "name": "STATUS"
                },
                {
                    "value": "0",
                    "name": "SUBTYPE"
                },
                {
                    "value": "USD",
                    "name": "CURRENCY"
                }
            ]
        },
        {
            "column": [
                {
                    "value": "W",
                    "name": "TYPE"
                },
                {
                    "value": "S",
                    "name": "STATUS"
                },
                {
                    "value": "0",
                    "name": "SUBTYPE"
                },
                {
                    "value": "USD",
                    "name": "CURRENCY"
                }
            ]
  
        }
    ]
} 
JSON_2:

{
    "sqlQuery": "select type,subtype from wetrade_p2 where parent_id='69341269'",
    "message": "2 rows selected",
    "row": [
     {
            "column": [
                {
                    "value": "W",
                    "name": "TYPE"
                },
                {
                    "value": "S",
                    "name": "STATUS"
                },
                {
                    "value": "0",
                    "name": "SUBTYPE"
                },
                {
                    "value": "USD",
                    "name": "CURRENCY"
                }
            ]
  
        },
        {
            "column": [
                {
                    "value": "W",
                    "name": "TYPE"
                },
                {
                    "value": "P",
                    "name": "STATUS"
                },
                {
                    "value": "0",
                    "name": "SUBTYPE"
                },
                {
                    "value": "USD",
                    "name": "CURRENCY"
                }
            ]
        }
       
    ]
}
如果您检查上述JSON_1和JSON_2,并且两者都具有相同的值,但行不匹配/JSON对象顺序不一致。因此,即使值相同,下面的代码也返回FALSE:

代码:

compareActualAndExpectedResponse:function (jsonActual,jsonExpected)  {

                var jsonObject1 = JSON.parse(jsonActual);
                var jsonObject2 = JSON.parse(jsonExpected);
                var keys = Object.keys(jsonObject1);
                      for (var i = 0; i < keys.length; i++) {
                                 var key = keys[i];
                                      if (jsonObject1[key] != jsonObject2[key]) {
                                              console.log(key + " value changed from '" + jsonObject1[key] + "' to '" + jsonObject2[key] + "'");
                                              return false;
                                         }
                        }
                 return true;
}
var methods = {

            getuuid:function () {
                return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
                    var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
                    return v.toString(16);
                  });
             },

             compareActualAndExpectedResponse:function (jsonActual, jsonExpected) {
                if (Object.prototype.toString.call(jsonActual) !==
                  Object.prototype.toString.call(jsonExpected)) {
                      console.log("false 1");
                  return false;
                }
              
                if (Array.isArray(jsonActual)) {
                  if (jsonActual.length !== jsonExpected.length) {
                      console.log("false 2")
                    return false;
                  }
              
                  let i = jsonActual.length;
              
                  while (i--) {
                    let j = jsonExpected.length;
                    let found = false;
              
                    while (!found && j--) {
                      if (compareActualAndExpectedResponse(jsonActual[i], jsonExpected[j])) found = true;
                    }
              
                    if (!found) {
                        console.log("false 3");
                      return false;
                    }
                  }
              console.log("true 1")
                  return true;
                }
              
                if (Object.prototype.toString.call(jsonActual) === '[object Object]') {
                  for (const key in jsonActual) {
                    if (Object.prototype.hasOwnProperty.call(jsonActual, key)) {
                      if (!Object.prototype.hasOwnProperty.call(jsonExpected, key)) {
                          console.log("false 4");
                          return false; 
                      }
              
                      if (!compareActualAndExpectedResponse(jsonActual[key], jsonExpected[key])) {
                        console.log("false 5")
                        return false;
                      }
                    }
                  }
                  for (const key in jsonExpected) {
                    if (Object.prototype.hasOwnProperty.call(jsonExpected, key) &&
                      !Object.prototype.hasOwnProperty.call(jsonActual, key)) {
                          console.log("false 6")
                      return false;
                    }
                  }
              console.log("true 2")
                  return true;
                }
              
                return jsonActual === jsonExpected;
              }
        };

module.exports = methods;
客户端.JS:

var utils = require('./Utils');

 if(key.includes("entireJSONResponse"))
                  {
                    var data=fs.readFileSync(global.path+"/validationJSON/JSONResponseValidator/Bank.json",'utf8')
                    data=data.replace("{buyer}",transresult.get("buyeraccountnumber"));
                    const expected=JSON.stringify(transresult.get(key),null,4);
                    console.log(expected)
                    console.log(data);
                    var validationResult=utils .compareActualAndExpectedResponse(data,expected);
                    console.log(validationResult); //Still return false
                    console.log(utils.compareActualAndExpectedResponse(dataFinal,expected));
                    console.log("*************************************")
                  }

我最近解决了一个类似的问题。 这是我使用的代码,适用于您的用例

函数compareActualAndExpectedResponse(jsonActual,jsonExpected){
if(Object.prototype.toString.call(jsonActual)==
Object.prototype.toString.call(jsonExpected)){
返回false;
}
if(Array.isArray(jsonActual)){
if(jsonActual.length!==jsonExpected.length){
返回false;
}
设i=j实际长度;
而(我--){
设j=jsonExpected.length;
让发现=错误;
而(!found&&j--){
如果(compareActualAndExpectedResponse(jsonActual[i],jsonExpected[j])发现=true;
}
如果(!找到){
返回false;
}
}
返回true;
}
if(Object.prototype.toString.call(jsonActual)='[Object-Object]'){
for(jsonActual中的常量键){
if(Object.prototype.hasOwnProperty.call(jsonActual,key)){
if(!Object.prototype.hasOwnProperty.call(jsonExpected,key)){
返回false;
}
如果(!compareActualAndExpectedResponse(jsonActual[key],jsonExpected[key])){
返回false;
}
}
}
for(jsonExpected中的常量键){
if(Object.prototype.hasOwnProperty.call(jsonExpected,key)&&
!Object.prototype.hasOwnProperty.call(jsonActual,key)){
返回false;
}
}
返回true;
}
返回jsonActual==jsoneexpected;
}
常量JSON_1={
sqlQuery:“从wetrade_p2中选择类型,子类型,其中父级_id='69341269',
消息:“已选择2行”,
行:[{
专栏:[{
值:“W”,
名称:'类型',
},
{
值:“P”,
名称:'状态',
},
{
值:“0”,
名称:'子类型',
},
{
价值:'美元',
名称:'货币',
},
],
},
{
专栏:[{
值:“W”,
名称:'类型',
},
{
值:“S”,
名称:'状态',
},
{
值:“0”,
名称:'子类型',
},
{
价值:'美元',
名称:'货币',
},
],
},
],
};
常量JSON_2={
sqlQuery:“从wetrade_p2中选择类型,子类型,其中父级_id='69341269',
消息:“已选择2行”,
行:[{
专栏:[{
值:“W”,
名称:'类型',
},
{
值:“S”,
名称:'状态',
},
{
值:“0”,
名称:'子类型',
},
{
价值:'美元',
名称:'货币',
},
],
},
{
专栏:[{
值:“W”,
名称:'类型',
},
{
值:“P”,
名称:'状态',
},
{
值:“0”,
名称:'子类型',
},
{
价值:'美元',
名称:'货币',
},
],
},
],
};

log(compareActualAndExpectedResponse(JSON_1,JSON_2))即使位置相同,结果也将是
false
,因为对象是通过引用进行比较的
jsonObject1[key]!=jsonObject2[key]
我不理解这个问题。这些值不一样。这两个json的
状态值不同
需要比较两个json_1和json_2。json对象的顺序将不会保持不变。但是,如果您检查json_1和json_2中的数据,它们将是相同的。希望能有帮助。非常感谢。。让我检查一下,并告诉你最新情况。。!!!您可以共享JSFIDLE吗?这样我就可以使用我拥有的不同有效负载进行检查这里有一个repl.it链接,@ArrchanaMohan代码将比较两个JSON对象是否相等,它忽略了数组元素的显示顺序。你能提供一个没有给出预期结果的例子吗?我已经用你在问题中给出的例子说明了,它返回true,最后它起作用了。。我需要解析JSON并创建一个变量,然后需要将其传递给函数。非常感谢你。。你节省了一天的时间…这对你很有帮助。接受你的回答