Angular和JS不同意什么是平等对象

时间:2015-06-26 12:17:27

标签: javascript arrays angularjs

我正在创建一个显示一些数据的应用程序。它有一个网格和一个数据源。

我会先向您展示问题并尝试解释一下情况。

$scope.onSelectRow = function (row, rowId) { 
                var a = row;
                var b = _.findWhere($scope.gridData.rows, {id: rowId});
                var c = a === b;
                console.log('Does JS think they are the same ? -> ' + c);
                console.log('Does Angular think they are the same ? -> ' + angular.equals(a, b));
                console.log('\nThe objects:');
                console.log(a);
                console.log(b);
                console.log('\nThe indexes:'); // what i really need
                console.log('Index of a:' + $scope.gridData.rows.indexOf(row));
                console.log('Index of b:' + $scope.gridData.rows.indexOf(b));
{

在这段代码中,我试图找出元素的索引。该元素最初位于$ scope.gridData.rows数组中。此数组显示在屏幕上的网格上。当我选择一行并传递2个参数时会触发onSelectRow函数

  • 行 - >表的整行直接映射到$ scope.gridData.rows数组
  • rowId - > row元素的Id属性(与'row'参数相同的行元素a.k.a rowId = row.id)

这些代码行的输出是一次 http://s23.postimg.org/apl2ebatn/Stack_Overflow_Normal_Pic.png

但是当数据被更新并重新加载然后有人再次点击一行并且运行相同的逻辑时输出就是 http://s12.postimg.org/6s4d6rajh/Stack_Overflow_Strange_Pic.png

第一次,角度和JS同意对象是相等的,但是在第二张图片上JS并不认为对象是相等的但有角度的......原则上它们是相同的,因为你有所看见,因为我有打印它们但主要是因为它们来自同一来源。

最后我关心的是元素数组中所选元素的索引但是我试图避免在数组中搜索以找到对象,然后找到它的索引,因为我应该已经返回了正确的对象在桌旁给我。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

最后仔细阅读文档并牢记@ borja的回答后,angular.equals进行了'==='的比较,但也检查了其他一些事情而不是提出答案。

来自https://docs.angularjs.org/api/ng/function/angular.equals

  

如果中的至少一个,则认为两个对象或值是等效的   以下是真实的

     
      
  • 两个对象或值都通过===比较。
  •   
  • 两个对象或值都属于同一类型,并且它们的所有属性都是>等于比较   他们使用angular.equals。
  •   
  • 两个值均为NaN。 (在JavaScript中,NaN ==   NaN =>假。但我们认为两个NaN相等)
  •   
  • 两个值代表   相同的正则表达式(在JavaScript中,/ abc / == / abc / => false。   但是我们认为两个正则表达式在它们的文本上是相同的   表示匹配)。
  •   

答案 1 :(得分:0)

首先,找到索引的最简单方法是使用ng-repeat中的$ index从视图中传递它。 你的问题是a和b不是同一个参考。 对象具有相同的类型和相同的属性和值,因此angular表示它们是equal。但因为a和b的引用不同===返回它们不相等