Angular 中索引的检测:indexOf() 由于 $$hasKeys 而无法正常工作?

Detection of Index in Angular: indexOf() does not work properly because of $$hasKeys?

以下情况:

role: { roleid=3,  name="admin"}

availableRoles:
    [
        { roleid=3,  name="admin",  $$hashKey="object:222"}, 
        { roleid=4,  name="plain user",  $$hashKey="object:223"}
    ]

currentRoles: 
    [
        { roleid=3,  name="admin"}
    ]

以下尝试:

currentRoles.indexOf(role);  // works properly and outputs 0
availableRoles.indexOf(role);  // does not work 

我可以想象,这是因为 $$hasKeys。但我没有把它们放在那里,AngularJS 确实增加了这些数据。

我该如何克服这种情况?

是否有像这样的功能:忽略此数据结构中的 Angular HasKeys?

编辑:

Angular对象比较: Compare objects in Angular

所以你可以只写函数:

function arrayObjectIndexOf(arr, obj){
    for(var i = 0; i < arr.length; i++){
        if(angular.equals(arr[i], obj)){
            return i;
        }
    };
    return -1;
}

--原创--

JavaScript将对象保存为指针,因此,即使两个对象中有相同的数据,也有不同的值(指针在内存中的值)。

代码示例:

var role = { roleid:3,  name:"admin"};

var availableRoles =
    [
        { roleid:3,  name:"admin"}, 
        { roleid:4,  name:"plain user",  $$hashKey:"object:223"}
    ];
alert(availableRoles.indexOf(role));

http://codepen.io/anon/pen/BjobaW

因此与hashKey无关。要与对象进行比较(例如,在数组中找到索引),您必须创建一个比较循环,或者重载对象的“==”运算符来比较值而不是指针,我认为您不能这样做JS.

  • 最好不要有这样的对象...

  • 您可以使用 angular 过滤器:

function contains(arr, id) {
    return $filter('filter')(arr, {roleid : id}, true).length != 0;
}
  • 您可以使用其他一些 js 库(lodash、underscore 等)。