检查对象是否已在数组中不起作用

时间:2017-08-10 10:39:12

标签: javascript angularjs arrays

我正在尝试检查对象是否已经在数组中,请按照以下答案进行操作:How to determine if object is in array

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

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

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

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

  

array [i] == obj是false array [i]是{text:“10/08/17”}并且obj是   {text:“10/08/17”}

并且函数说它们不同(array[i] == obj is false)但它们看起来与我相同。

我还检查了两者的类型,即:

typeof array[i] is "object"
typeof obj is "object"
你能帮我解决这个问题吗?他们为什么不同?可能会有什么不同?

当我的角度应用的_createDatesArray根据ng模型更改其值时,会调用

$scope,但我不认为这是相关的

4 个答案:

答案 0 :(得分:3)

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

由于您使用的是AngularJS,因此您可以使用angular.equals()来对对象的属性进行深度比较。

答案 1 :(得分:1)

您要比较的对象不具有相同的引用,因此==返回false。有关更详细的说明,请参阅Object comparison in JavaScript

在这种特殊情况下,您可以简单地比较日期文本,看它们是否等效。但是,这对于函数名称所暗示的所有对象都不起作用。

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

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

dateInArray = function (array, date) {
  return array.some(function (arrayDate) {
    return arrayDate.text === date.text
  })
}

或者,更简洁地使用ES6箭头功能:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

这是因为JS中的对象通过引用进行比较,而不是通过它们具有的值进行比较。但是你需要按照它们的值来比较对象。因此,您需要获得一些第三方功能或编写自己的功能。还有一个选择是使用内置角度equals function

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

为了更好地理解,您可以阅读有关此主题的好文章here