提问者:小点点

比较两个复杂的JSON数组


我有一个由两个JSON对象组成的数组,我想确定它们是否相等。 下面是JSON对象的示例。

let JSON1 = {
  "products": [
    {
      "productname": "product1",
      "productversion": "1.0",
      "features": [{ "featurename": "feature1", "featureversion": "1.0" }],
    },
    {
      "productname": "product2",
      "productversion": "2.0",
      "features": [{ "featurename": "feature2", "featureversion": "2.0" }],
    },
    {
      "productname": "product3",
      "productversion": "3.0",
      "features": [{ "featurename": "feature3", "featureversion": "3.0" }],
    },
  ],
};

let JSON2 = {
  "products": [
    {
      "productname": "product2",
      "productversion": "2.0",
      "features": [{ "featurename": "feature2", "featureversion": "2.0" }],
    },
    {
      "productname": "product1",
      "productversion": "1.0",
      "features": [{ "featurename": "feature1", "featureversion": "1.0" }],
    },
    {
      "productname": "product3",
      "productversion": "3.0",
      "features": [{ "featurename": "feature3", "featureversion": "3.0" }],
    },
  ],
};

正如你看到的,我有三个乘积和一个与它们相关的特性,两个数组是相等的,只是数组元素的顺序不同。 对于上面的,它应该确定它是相等的。 只有在数组之间缺少一个对象时,才应为false。

let JSON3 = {
  "products": [
    {
      "productname": "product1",
      "productversion": "1.0",
      "features": [{ "featurename": "feature1", "featureversion": "1.0" }],
    },
    {
      "productname": "product2",
      "productversion": "2.0",
      "features": [{ "featurename": "feature2", "featureversion": "2.0" }],
    },
    {
      "productname": "product3",
      "productversion": "3.0",
      "features": [{ "featurename": "feature4", "featureversion": "4.0" }],
    },
  ],
};

let JSON4 = {
  "products": [
    {
      "productname": "product2",
      "productversion": "2.0",
      "features": [{ "featurename": "feature5", "featureversion": "5.0" }],
    },
    {
      "productname": "product1",
      "productversion": "1.0",
      "features": [{ "featurename": "feature1", "featureversion": "1.0" }],
    },
    {
      "productname": "product3",
      "productversion": "3.0",
      "features": [{ "featurename": "feature3", "featureversion": "3.0" }],
    },
  ],
};

比较JSON3和JSON4,它应该返回false,因为JSON4具有不同的特性集,我将其标记为粗体。 如何编写判断它们是否相等的脚本?

目前,我只是将属性值拉到数组,例如,我尝试比较prouductName和featureName,但这并不是一种有效的方法。 下面是代码片段。

我将不同的对象传递给下面的脚本,以便稍后比较数据。

let productNames = [];
let featureNames = [];
 for(let l=0;l<products.length;l++) {
   productNames.push(products[l].productname);
    for(let k=0;k<products[l].features.length;k++) {
      featureNames.push(products[l].features[k].featurename);
    }
} 

productNames.sort();
featureNames.sort();              

共1个答案

匿名用户

every()some()的帮助下,您可以完成您的任务。

null

let JSON3 = { products:[{"productname":"product1","productversion":"1.0","features":[{"featurename":"feature1","featureversion":"1.0"}] }, {"productname":"product2","productversion":"2.0","features":[{"featurename":"feature2","featureversion":"2.0"}] },{"productname":"product3","productversion":"3.0","features":[{"featurename":"feature4","featureversion":"4.0"}] }] };

let JSON4 = { products: [{"productname":"product2","productversion":"2.0","features":[{"featurename":"feature5","featureversion":"5.0"}] },{"productname":"product1","productversion":"1.0","features":[{"featurename":"feature1","featureversion":"1.0"}] },{"productname":"product3","productversion":"3.0","features":[{"featurename":"feature3","featureversion":"3.0"}] }] };

var result = JSON3.products.every(k=>JSON4.products.some(d=>d.productname ==k.productname && d.features.every(s=>k.features.some(l=>l.featurename==s.featurename))));

console.log(result);