【问题标题】:How to check if two object arrays have any difference in javascript? [duplicate]如何检查两个对象数组在javascript中是否有任何区别? [复制]
【发布时间】:2020-04-28 17:53:46
【问题描述】:

我正在使用 React 框架并将 prop 传递给维护状态的组件。 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 可以在数组中的多个对象中重复,所以它不能唯一标识一个对象。名称和标签是 json 对象中的可选键,但不必指定。

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

【问题讨论】:

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

标签: javascript arrays reactjs


【解决方案1】:

使用类似这样的普通 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2013-05-20
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多