javascript 检查两个数组是否包含相同的对象 - 反应 componentDidUpdate

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/48639336/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 08:09:17  来源:igfitidea点击:

check if two arrays contain identical objects - react componentDidUpdate

javascriptreactjsecmascript-6

提问by peter flanagan

I am using React's componentDidUpdatelifecycle method.

我正在使用 React 的componentDidUpdate生命周期方法。

I am trying to determine whether or not two arrays are the same.

我试图确定两个数组是否相同。

My prevStatearray looks like this:

我的prevState数组看起来像这样:

prevState.players = [
  {
    name: 'Wayne Rooney',
    age: 31
  }, 
  {
    name: 'Lionel Messi',
    age: 29
  },
  {
    name: 'Robbie Fowler',
    age: 42
  }
];

and the this.statearray looks like this:

this.state阵列看起来像这样:

this.state.players = [
  {
    name: 'Wayne Rooney',
    age: 31
  }, 
  {
    name: 'Lionel Messi',
    age: 29
  },
  {
    name: 'Robbie Fowler',
    age: 42
  }
];

As you can see if you expand the snippet below they are not equal:

正如您所看到的,如果您展开下面的代码段,它们是不相等的:

let playersOne = [{
    name: 'Wayne Rooney',
    age: 31
  },
  {
    name: 'Lionel Messi',
    age: 29
  },
  {
    name: 'Robbie Fowler',
    age: 42
  }
];

let playersTwo = [{
    name: 'Wayne Rooney',
    age: 31
  },
  {
    name: 'Lionel Messi',
    age: 29
  },
  {
    name: 'Robbie Fowler',
    age: 42
  }
];

console.log(playersOne == playersTwo)

And here is my react lifecycle code.

这是我的反应生命周期代码。

  componentDidUpdate(prevProps, prevState) {
    if(prevState.players != this.state.players) {
      this.updatePlayers(this.state);
    }
  }

can anyone advise as to the best way to determine if the arrays are equal?

任何人都可以建议确定数组是否相等的最佳方法吗?

回答by Akash Dathan

JSON.stringify(playersOne) == JSON.stringify(playersTwo)

JSON.stringify(playersOne) == JSON.stringify(playersTwo)

回答by Hassan Imam

You can use array#everyto check if both objects have the same number of objects and each object has the same number of key and values.

您可以使用array#every检查两个对象是否具有相同数量的对象以及每个对象是否具有相同数量的键和值。

let playersOne = [{ name: 'Wayne Rooney', age: 31 }, { name: 'Lionel Messi', age: 29 }, { name: 'Robbie Fowler', age: 42 } ],
    playersTwo = [{ name: 'Wayne Rooney', age: 31 }, { name: 'Lionel Messi', age: 29 }, { name: 'Robbie Fowler', age: 42 } ];
 var isSame = playersOne.length === playersTwo.length && playersOne.every((o,i) => Object.keys(o).length === Object.keys(playersTwo[i]).length && Object.keys(o).every(k => o[k] === playersTwo[i][k]));
console.log(isSame);

回答by Faly

You can use array.prototype.every:

您可以使用array.prototype.every

var players = [
  {
    name: 'Wayne Rooney',
    age: 31
  }, 
  {
    name: 'Lionel Messi',
    age: 29
  },
  {
    name: 'Robbie Fowler',
    age: 42
  }
];

var statePlayers = [
  {
    name: 'Wayne Rooney',
    age: 31
  }, 
  {
    name: 'Lionel Messi',
    age: 29
  },
  {
    name: 'Robbie Fowler',
    age: 42
  }
];

var equals = players.length === statePlayers.length && players.every((e, i) => e.name === statePlayers[i].name && e.age === statePlayers[i].age);

console.log(equals);

回答by Bsalex

  1. Using _.isEqual from lodash;
  2. Using JSON.stringify and comparing the strings;
  1. 从 lodash 使用 _.isEqual;
  2. 使用 JSON.stringify 并比较字符串;