我正在尝试检查对象是否已经在数组中,请按照以下答案进行操作: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
,但我不认为这是相关的
答案 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)