如何检查两个对象数组在javascript中是否有任何差异?

如何检查两个对象数组在javascript中是否有任何差异?,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,我正在使用React框架,并将一个道具传递给维护状态的组件。prop和state是对象数组,我想在代码中的某个时刻验证这两者之间是否有任何更改 somethingHasChanged = () => { return !isEqual(this.props.array1.sort(), this.state.array1.sort()); }; 其中数组中的对象定义如下: array1: PropTypes.arrayOf( PropTypes.sha

我正在使用React框架,并将一个道具传递给维护状态的组件。prop和state是对象数组,我想在代码中的某个时刻验证这两者之间是否有任何更改

  somethingHasChanged = () => {
    return !isEqual(this.props.array1.sort(), this.state.array1.sort());
  };
其中数组中的对象定义如下:

    array1: PropTypes.arrayOf(
      PropTypes.shape({
        id: PropTypes.string,
        name: PropTypes.string,
        label: PropTypes.string,
      }),
    ),
id可以在数组中的多个对象中重复,因此它不能唯一标识一个对象。Name和label是json对象中的可选键,但不必指定


现在我对两个数组进行排序,然后检查它们是否相等,但我看到一些奇怪的行为。有时,当我期望两个数组相等时,它们是不同的,因为内容相同,但顺序不一样,即使我在两个数组上都调用了
sort()
。有没有更好、更简单/更灵活的方法,而不是进行深入的比较?

使用像这样的简单JS

a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"},  { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}]
b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}]

function comparer(otherArray){
  return function(current){
    return otherArray.filter(function(other){
      return other.value == current.value && other.display == current.display
    }).length == 0;
  }
}

var onlyInA = a.filter(comparer(b));
var onlyInB = b.filter(comparer(a));

result = onlyInA.concat(onlyInB);

console.log(result);

你认为在没有比较功能的情况下,它将如何对它们进行排序?您是否尝试过在web上搜索“js比较对象数组”,因为您仍然需要自定义比较?有多种方法可以做到这一点;您可能需要根据自己的具体需求、正在使用的库/模块等选择一个。您还需要查看您在
isEqual
中的操作。排序没有按您预期的方式工作,因为排序函数不知道哪个对象更大或更小。@user120242 isEqual来自lodash库。不过,我有一个问题。如果内容相同,为什么我的道具数组和状态数组之间的排序会发生变化?在调用
sort()
结束时,我希望得到相同的结果。如果一个数组与另一个数组有所不同,这对我来说是有意义的,但在这种情况下(至少据我所知),两个数组都是sameI检查的对象,以查看从道具复制后您的状态是否被修改以及如何修改。可能需要实际控制台。注销这些值并比较它们。