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"}
函数表明它们是不同的(
我还检查了这两种类型,即:
1 2 | typeof array[i] is"object" typeof obj is"object" |
你能帮我吗?为什么它们不同?有什么不同?
当我的角型应用程序的
它们是两个内容相同的不同对象。将它们与
因为您使用的是AngularJS,所以可以使用
您要比较的对象没有相同的引用,因此
在这个特殊的例子中,您可以简单地比较日期的文本,看看它们是否是等价的。但是,这并不能适用于函数名所建议的所有对象。
或者,您可以创建一个特定的方法来检查您的数组是否包含给定的日期,并使用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中的对象是通过引用进行比较的,而不是通过它们拥有的值进行比较。但您需要根据对象的值来比较它们。所以你需要一些第三方的功能或者自己写。另一种选择是使用角度内置的
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++; } }; |