Как сравнить два больших массива объектов на идентичность - PullRequest
0 голосов
/ 28 февраля 2019

Я должен сравнить два больших массива объектов в реагирующем компоненте и получит реквизиты.У меня есть массив из 261 страны.Например, это начинается с этого.

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

Я должен сравнить, что массив, который будет получен в следующих реквизитах, абсолютно идентичен моему текущему массиву стран, то есть все свойства, длина, значения свойств, все вещиравны.Пожалуйста, помогите мне.Я написал что-то вроде этого, но я знаю, просто! == не правильно.

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

Любые ответы будут учтены.Возможно, у lodash есть некоторые методы, которые упростят задачу, я не знаю.Любые ответы будут рассмотрены.Заранее спасибо.

Ответы [ 5 ]

0 голосов
/ 28 февраля 2019

есть несколько вариантов, здесь их мало, но если вы хотите сделать это в чистом JS, вы можете использовать фильтр, я приведу пример, возможно, это поможет.

у нас естьмассив именованных компаний:

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)

с фильтром, просто используя или (||) и, и(&&) вы можете написать несколько условий.Фильтр является методом JS ES6 и подходит для подобных задач.

0 голосов
/ 28 февраля 2019

Массивы являются ссылочными типами, поэтому при сравнении их будет просто сравниваться их ссылки, а не их содержимое.

A быстрый способ (программно) для сравнения содержимоговаши массивы должны привести их в строковое значение 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));
0 голосов
/ 28 февраля 2019

Да, у 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);
0 голосов
/ 28 февраля 2019

Если я понимаю ваш вопрос, вы пытаетесь понять, равны ли два массива объектов друг другу.Один из способов сделать это в 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
0 голосов
/ 28 февраля 2019

Вы можете упорядочить массивы и сравнить строки

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);
...