【问题标题】:Comparing two array of nested objects比较两个嵌套对象数组
【发布时间】:2020-01-17 04:49:05
【问题描述】:
var a = [{
    id: 'Monday',
    slots: [{
        end: "05:00:00 PM",
        start: "08:00:00 AM"
      },
      {
        end: "04:00:00 PM",
        start: "03:00:00 AM"
      }
    ]
  },
  {
    id: 'Tuesday',
    slots: [{
      end: "05:00:00 PM",
      start: "08:00:00 AM"
    }]
  }
];
var b = [{
    id: 'Monday',
    slots: [{
        end: "04:00:00 PM",
        start: "06:00:00 AM"
      },
      {
        end: "03:00:00 PM",
        start: "02:00:00 AM"
      }
    ]
  },
  {
    id: 'Tuesday',
    slots: [{
      end: "05:00:00 PM",
      start: "08:00:00 AM"
    }]
  },
  {
    id: 'Wednesday',
    slots: [{
      end: "05:00:00 PM",
      start: "08:00:00 AM"
    }]
  }
];

我尝试了 JSON.stringify(a) === JSON.stringify(b) 但由于它是嵌套对象,因此无法正常工作。有没有办法比较嵌套对象数组的开始和结束?

id(key)s 在 a 和 b 中都是一样的,只有时间段和它的值会改变

【问题讨论】:

  • "我试过" ...数组不相等?
  • "only timeslots and it's values will change":如果值不同,则数组不同。您可能想过滤掉slots,然后像这样比较(filteredArray1 == filteredArray2)
  • 鉴于您已经显示了输入,预期输出是什么以及为什么
  • 预期输出为真/假,如果相同或不同
  • 那么您当前的代码是正确的,因为这两个对象是不同的。问题解决了。

标签: javascript jquery arrays multidimensional-array javascript-objects


【解决方案1】:

在这里您可以检查每个和每个嵌套数组的对象值的值。


下面的代码将控制 两个数组是相同的

如果更改 object 的任何值,将导致 两个数组都不相同

var a = [{
    id: 'Monday',
    slots: [{
        end: "05:00:00 PM",
        start: "08:00:00 AM"
      },
      {
        end: "04:00:00 PM",
        start: "03:00:00 AM"
      }
    ]
  },
  {
    id: 'Tuesday',
    slots: [{
      end: "05:00:00 PM",
      start: "08:00:00 AM"
    }]
  }
];

var b = [{
    id: 'Monday',
    slots: [{
        end: "05:00:00 PM",
        start: "08:00:00 AM"
      },
      {
        end: "04:00:00 PM",
        start: "03:00:00 AM"
      }
    ]
  },
  {
    id: 'Tuesday',
    slots: [{
      end: "05:00:00 PM",
      start: "08:00:00 AM"
    }]
  }
];

var flag = false;
if (a.length != b.length) {
  flag = true;
  console.log("Both array are not same as there don't have equal length");
}
if (flag == false) {
  a.forEach(function(aObject) {
    b.forEach(function(bObject) {
      if (aObject.id == bObject.id) {
        for (var i = 0; i < aObject.slots.length; i++) {
          if ((aObject.slots[i].end != bObject.slots[i].end) || (aObject.slots[i].start != bObject.slots[i].start)) {
            flag = true;
            console.log("Both arrays are not equal");
          }
        }
      }
    });
  });
}



if(flag == true){
  console.log("both arrays are not same");
}
else{
  console.log("both arrays are same ");
}

您可以查看我运行代码的结果。

【讨论】:

    【解决方案2】:

    使用来自 lodash 的 _.differenceWith,并传递一个比较两个数组的比较器,如下所示:

    _.differenceWith(a, b, _.isEqual);
    

    a.sort().every((value, index) => value === b.sort()[index])
    

    【讨论】:

      猜你喜欢
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多