关于javascript:检查对象是否已在数组中不起作用

Checking if object is already in array not working

我正在尝试检查对象是否已经在数组中,请遵循以下答案:如何确定对象是否在数组中

我根据自己的需要调整了功能,现在看起来是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var _createDatesArray, _objInArray;

_objInArray = function(array, obj) {
  var i;
  i = 0;
  while (i < array.length) {
    console.log("array[i] == obj is", array[i] === obj," array[i] is", array[i]," and obj is", obj);
    if (array[i] === obj) {
      return true;
    }
    i++;
  }
};

_createDatesArray = function(val) {
  var result;
  if (val != null) {
    result = {
      text: val
    };
    if (!_objInArray(scope.datesQuestion.dates, result)) {
      scope.datesQuestion.dates.push(result);
    }
    return console.log(scope.datesQuestion.dates);
  }
};

我需要做的是,基本上看对象是否已经在数组中,如果已经在数组中,则T返回true。

调试时,控制台日志的结果如下:

array[i] == obj is false array[i] is {text:"10/08/17"} and obj is
{text:"10/08/17"}

函数表明它们是不同的(array[i] == obj is false),但在我看来是一样的。

我还检查了这两种类型,即:

1
2
typeof array[i] is"object"
typeof obj is"object"

你能帮我吗?为什么它们不同?有什么不同?

当我的角型应用程序的$scope根据ng模型更改其值时,调用_createDatesArray,但我认为这与


它们是两个内容相同的不同对象。将它们与=====进行比较将产生错误的结果。

因为您使用的是AngularJS,所以可以使用angular.equals()来对对象的属性进行深入的比较。


您要比较的对象没有相同的引用,因此==返回false。请参阅JavaScript中的对象比较以获得更详细的解释。

在这个特殊的例子中,您可以简单地比较日期的文本,看看它们是否是等价的。但是,这并不能适用于函数名所建议的所有对象。

if (arr[i].text === obj.text)

或者,您可以创建一个特定的方法来检查您的数组是否包含给定的日期,并使用array.prototype大大简化它。一些:

1
2
3
4
5
dateInArray = function (array, date) {
  return array.some(function (arrayDate) {
    return arrayDate.text === date.text
  })
}

或者,更简洁地使用ES6箭头函数:

1
dateInArray = (array, date) => array.some(arrayDate => arrayDate.text === date.text)


这是因为JS中的对象是通过引用进行比较的,而不是通过它们拥有的值进行比较。但您需要根据对象的值来比较它们。所以你需要一些第三方的功能或者自己写。另一种选择是使用角度内置的equals函数。

1
angular.equals($scope.user1, $scope.user2);

为了更好的理解,你可以在这里读一篇关于这个主题的好文章。


array[i]==obj只有当它的对象相同时才会返回true。在您引用的链接中,被检查的对象与插入到数组中的对象相同,这就是它返回true的原因。在您的例子中,您正在创建一个新的对象"result",并在其中添加值。因此数组不包含完全相同的对象,因此返回false。如果"text"是对象中唯一的属性,则可以检查两个对象中的"text"属性是否相同,而不是检查整个对象。

1
2
3
4
5
6
7
8
9
10
_objInArray = function(array, obj) {
  var i;
  i = 0;
  while (i < array.length) {
    if (array[i].text === obj.text) {
      return true;
    }
    i++;
  }
};