【问题标题】:How to compare two big arrays of objects on identity如何比较两个大对象数组的身份
【发布时间】:2019-02-28 11:44:10
【问题描述】:

我必须比较 react componentwillreceiveprops 中的两个大对象数组。我有 261 个国家/地区的数组。比如从这里开始。

 countries = [
     {id: 1, name: "Australia", code: "AU", isRemoved: false}
      ...
      261 objects
 ]

我必须比较下一个 props 中将接收的数组与我当前的国家数组是绝对相同的,即所有属性、长度、属性值,所有东西都是平等的。请帮我。我写了这样的东西,但我知道!== 不正确。

if (this.state.countriesInitial !== countries) {//TODO: compare arrays
      this.setState({
          countriesInitial: countries
      })
}

我们将考虑任何答案。也许 lodash 有一些方法可以简化任务,我不知道。任何答案都会被考虑。提前致谢。

【问题讨论】:

标签: javascript arrays reactjs object lodash


【解决方案1】:

是的,lodash 有一种让生活更轻松的方法 - _.isEqual():

var arr1 = [ /* Very long array */ ],
    arr2 = [ /* Also long array */ ];
var equalArrays = _.isEqual(arr1, arr2);

或者,使用 JSON 方法:

var arr1 = [ /* Very long array */ ],
    arr2 = [ /* Also long array */ ];
var equalArrays = JSON.stringify(arr1) == JSON.stringify(arr2);

【讨论】:

  • 感谢您的回答。我想问:lodash 是比较对象数组还是只是数组?我想测试它,但我不知道 codepen 或 jsfiddle 是否支持 lodash?哪个在线编辑器支持lodash?
  • 刚刚在jsfiddle上测试过,两种方法都可以。谢谢。
  • 没问题@Dragon14,总是乐于提供帮助。
  • 嗨,杰克。你能帮我解决我的问题吗? stackoverflow.com/questions/57652942/…
【解决方案2】:

您可以对数组进行字符串化并比较字符串

const arr1 = [
  {
    id:1,
    name: 'Australia'
  },
  {
    id:2,
    name: 'Greece'
  }
];

const arr2 = [
  {
    id:1,
    name: 'Australia'
  },
  {
    id:2,
    name: 'Greece'
  }
];

function arraysEqual(arr1, arr2) {
  return JSON.stringify(arr1) === JSON.stringify(arr2);
}

const compare = arraysEqual(arr1, arr2);
console.log(compare);

【讨论】:

    【解决方案3】:

    如果我理解您的问题,您正在尝试查看两个对象数组是否彼此相等。在 vanilla JS 中执行此操作的一种方法是使用 JSON.stringify()

    const countries = [{id: 1, name: "Australia", code: "AU", isRemoved: false}],
    nextProp = [{id: 1, name: "Australia", code: "AU", isRemoved: false}],
    
    checkEq = (arr, arr2) =>
        JSON.stringify(arr) === JSON.stringify(arr2)
    
    console.log(checkEq(countries, nextProp)); // true
    console.log(checkEq([{a: 1}], [{a: 1}, {b: 2}])); // false

    【讨论】:

      【解决方案4】:

      有几个选项,你在这里得到的很少,但如果你想在纯 JS 中做,你可以使用过滤器,我在这里给你一个例子,也许它会有所帮助。

      我们有一个名为 Companies 的数组:

      const companies = [
          {name: "blueweb360", category: "internet", start: 2013, end: 2014},
          {name: "Himo", category: "internet", start: 2015, end: 2016},
          {name: "blue", category: "IOT", start: 2014, end: 2017},
          {name: "waac", category: "Tech", start: 2016, end: 2019}
      
      ];
      

      现在我们需要找到与互联网类别相同的公司:

      const retail = companies.filter(iterator => iterator.category == "internet")
      
      document.write(JSON.stringify(retail)) //or you can write console.log(retail)
      

      使用过滤器只需使用 or(||) and, and(&&) 您可以编写多个条件。 filter 是 JS ES6 的方法,很适合这样的问题。

      【讨论】:

        【解决方案5】:

        数组是引用类型,因此比较它们只会比较它们的引用而不是它们的内容。

        比较数组内容的快速方法(以编程方式)是使用JSON.stringify() 对它们进行字符串化并比较结果字符串:

        const arr1 = [
          {id: 1, name: "Australia", code: "AU", isRemoved: false},
          {id: 2, name: "France", code: "FR", isRemoved: false}
        ];
        const arr2 = [
          {id: 1, name: "Australia", code: "AU", isRemoved: false},
          {id: 2, name: "France", code: "FR", isRemoved: false}
        ];
        const arr3 = [
          {id: 1, name: "Austria", code: "AS", isRemoved: false},
          {id: 2, name: "France", code: "FR", isRemoved: false}
        ];
        
        console.log(JSON.stringify(arr1) === JSON.stringify(arr2));
        console.log(JSON.stringify(arr1) === JSON.stringify(arr3));

        或者比对整个数组进行字符串化更快的方法,首先比较长度,如果它们匹配,则使用Object.entries()Array.every() 比较每个条目。

        如果您的条目的字段是原始类型(不是数组或对象),这将起作用,否则您将需要此的递归版本:

        const sameEntries = (x, y) => {
          const xEntries = Object.entries(x);
          if (xEntries.length !== Object.entries(y).length) return false;
          return xEntries.every(([k,v]) => y[k] === v);
        }
        
        const sameArrays = (arr1, arr2) =>
          arr1.length === arr2.length && arr1.every((x, i) => sameEntries(x, arr2[i]));
        
        const arr1 = [
          {id: 1, name: "Australia", code: "AU", isRemoved: false},
          {id: 2, name: "France", code: "FR", isRemoved: false}
        ];
        const arr2 = [
          {id: 1, name: "Australia", code: "AU", isRemoved: false},
          {id: 2, name: "France", code: "FR", isRemoved: false}
        ];
        const arr3 = [
          {id: 1, name: "Austria", code: "AS", isRemoved: false},
          {id: 2, name: "France", code: "FR", isRemoved: false}
        ];
        
        console.log(sameArrays(arr1, arr2));
        console.log(sameArrays(arr1, arr3));

        【讨论】:

        • 谢谢,对数组进行字符串化很酷,但第二种方法对我来说有点困难
        猜你喜欢
        • 1970-01-01
        • 2019-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-02
        相关资源
        最近更新 更多