此答案描述了使用DeltaJSON REST API 解决问题的方法。DeltaJSON 是一种商业产品,可将 API 作为服务 (SaaS) 或通过可在本地运行的 REST 服务器提供:
- 启动DeltaJSON Rest Server(需要 Java 安装和许可文件):
java -jar deltajson-rest-1.1.0.jar
arrayAlignment
在您的 JavaScript 中,调用属性设置为的 DeltaJSON REST API orderless
。
下面的示例代码显示了如何使用此属性设置调用 API:
async function runTest() {
const group1 = {
id: 123,
users: [
{ id: 234, name: "John" },
{ id: 345, name: "Mike" }
]
};
const group2 = {
id: 123,
users: [
{ id: 345, name: "Mikey" },
{ id: 234, name: "John" }
]
};
// call wrapper function that makes the REST API call:
const isEqual = await compare(group1, group2);
// log the comparison result: true
console.log("isEqual", isEqual);
}
async function compare(aData, bData) {
const aString = JSON.stringify(aData);
const bString = JSON.stringify(bData);
const blobOptions = { type: "application/json" };
var formdata = new FormData();
formdata.append("a", new Blob([aString], blobOptions));
formdata.append("b", new Blob([bString], blobOptions));
formdata.append("arrayAlignment", "orderless");
const myHeaders = new Headers();
myHeaders.append("Accept", "application/json");
var requestOptions = {
method: "POST",
headers: myHeaders,
body: formdata,
redirect: "follow"
};
try {
const response = await fetch(
"http://localhost:8080/api/json/v1/compare",
requestOptions
);
const jsonObj = await response.json();
console.log(jsonObj);
const dataSets = jsonObj.dx_deltaJSON.dx_data_sets;
const isEqual = dataSets === "A=B";
return isEqual;
} catch (e) {
console.error(e);
}
}
// run the test:
runTest(); // true
解释:
DeltaJSON Rest API 响应是 JSON 输入的注释形式。添加了额外dx_
的前缀属性来描述更改。元数据dx_deltaJSON
属性也包含在 JSON 中。
属性的值dx_deltaJSON
是一个具有属性的对象dx_data_sets
,我们可以测试该属性以查看(在双向比较中)该值是A=B
.
这是与问题中的输入略有不同的结果。在这里,除了更改数组项的顺序外,“Mike”已更改为“Mikey”:
{
"dx_deltaJSON": {
"dx_data_sets": "A!=B",
"dx_deltaJSON_type": "diff",
"dx_deltaJSON_metadata": {
"operation": {
"type": "compare",
"input-format": "multi_part",
"output-format": "JSON"
},
"parameters": {
"dxConfig": [],
"arrayAlignment": "orderless",
"wordByWord": false
}
},
"dx_deltaJSON_delta": {
"id": 123,
"users": [
{
"id": 345,
"name": {
"dx_delta": {
"A": "Mike",
"B": "Mikey"
}
}
},
{
"id": 234,
"name": "John"
}
]
}
}
}