AngularJS ng-repeat 和 indexOf() 检查对象

AngularJS ng-repeat and indexOf() to check objects

我有两个具有相关信息的 json 对象(data1 和 data2)。也就是说,两个对象都具有属性(数组),而这些属性又可以具有相同的数据。因此,我试图弄清楚如何通过正确突出显示这些数据来显示它们,即相同的数据具有绿色,而不同的数据具有红色。它以某种方式错误地用红色突出显示了所有数据。

这是html:

<ul>
  <li ng-repeat="item in vm.data2.features"
      ng-class="vm.data1.features.indexOf(item) !== -1 ? 'check' : 'uncheck'">
    <span ng-bind="item.id"></span>
  </li>
</ul>

和对象:

vm.data1 = {
  id: '4569',
  name: 'Given data',
  features: [
    {id: "TEST_TEXT2", desc: 'smth12'},
    {id: "TEST_PPP", desc: 'smthsmthsmth'},
    {id: "TEST_ECASH", desc: "somelongtexthere"}
  ]
};

vm.data2 = {
  id: '1305',
  name: 'Base data',
  features: [
    {id: "TEST_BP", desc: 'smth'},
    {id: "TEST_TEXT2", desc: 'smth12'},
    {id: "TEST_PPP", desc: 'smthsmthsmth'},
    {id: "TEST_TEXT1", desc: 'blahblah'},
    {id: "TEST_ECASH", desc: "somelongtexthere"}
  ]
};

完整的演示是 here

如有任何帮助,我们将不胜感激。

None 个对象将相同,因为 indexOf(item) 将比较 item 的对象引用。您需要对项目进行深度相等比较。

{id: "TEST_TEXT2", desc: 'smth12'} === {id: "TEST_TEXT2", desc: 'smth12'} // false
vm.data1.features[0] === vm.data1.features[1] // false

使用 lodash 的示例如下:

_.some(vm.data1.features, otherItem => _.isEqual(item, otherItem))

因为

_.isEqual(vm.data1.features[0], vm.data2.features[1]) // true

Lodash 文档:

Indexof() 方法将查找对象引用中的相似性而不是 id 本身。 findIndex() 这里的方法可以帮到你。

vm.hasFeature = function(item){
var hasElements= vm.data1.features.findIndex(function(e){
  return e.id == item.id;
});
 console.log(item, hasElements);
 return hasElements;
}

并在 html

<li ng-repeat="item in vm.data2.features"
    ng-class="vm.hasFeature(item) > -1 ? 'check' : 'uncheck'">
vm.hasFeature = function(item){
   var hasElements= vm.data1.features.findIndex(function(e){
      return e.id == item.id;
    });
    console.log(item, hasElements);
    return hasElements;
} 

CodePen Link: https://codepen.io/anon/pen/ewgLBN?editors=1010