Angular 如何检查对象是否存在于对象数组中

How to check if object exists inside array of object in Angular

我正在使用 Angular 8. 我想检查 Angular 对象是否存在于对象数组中。 我的目标是:

let objVenIns = {
                'CntNumber': 4,
                'CntMixer': 2,
                'DevicePositions': 'NA',
                'AddComments': 'NA',                
            }

对象数组还包含其他列:-

let arrRowData = [0: {'SrNo' : 1, 'Name' : 'ABC', 'CntNumber': 1,'CntMixer': 3,'DevicePositions': 'Right','AddComments': 'NA'},
    1: {'SrNo' : 2, 'Name' : 'DEF', 'CntNumber': 4,'CntMixer': 2,'DevicePositions': 'NA','AddComments': 'NA'},
    2: {'SrNo' : 3, 'Name' : 'XYZ', 'CntNumber': 2,'CntMixer': 5,'DevicePositions': 'Left','AddComments': 'NA'}]

在Angular JS中,我曾经执行以下功能来检查对象是否存在于数组中:-

var data = $filter('filter')($scope.arrRowData, objVenIns, true)[0];

如何在Angular8中实现这样的对象搜索?

您也可以将 array.Find or Array.Filter 与 Angular 一起使用。

let arrRowData = [{'SrNo' : 1, 'Name' : 'ABC', 'CntNumber': 1,'CntMixer': 3,'DevicePositions': 'Right','AddComments': 'NA'},
    {'SrNo' : 2, 'Name' : 'DEF', 'CntNumber': 4,'CntMixer': 2,'DevicePositions': 'NA','AddComments': 'NA'},
    {'SrNo' : 3, 'Name' : 'XYZ', 'CntNumber': 2,'CntMixer': 5,'DevicePositions': 'Left','AddComments': 'NA'}];

let objVenIns = {
                'CntNumber': 4,
                'CntMixer': 2,
                'DevicePositions': 'NA',
                'AddComments': 'NA',                
            };
            
//if you want to check whole object
var isInArray = arrRowData.indexOf(objVenIns) !== -1;
console.log(isInArray);

//if you want to check by prop values

var isInArray1 = arrRowData.find(function(el){ return el.CntNumber === 4 && el.CntMixer ==2 }) !== undefined;
console.log(isInArray1);

您也可以像这样使用 Array.Propotype.reduce()

const filter = arrRowData.reduce((a, e, i) => {
    if (
      e.CntMixer === objVenIns.CntMixer &&
      e.CntNumber === objVenIns.CntNumber &&
      e.DevicePositions === objVenIns.DevicePositions &&
      e.DevicePositions === objVenIns.DevicePositions &&
      e.AddComments === objVenIns.AddComments
    )
      a.push(e); return a;
}, []);  

console.log(filter)

您可以使用此 Link StackBlitz Link 来识别对象包含数组或对象 在这里,您可以使用 Array.isArray().

  • 数组结构是..

    arrRowData = [
        {'SrNo' : 1, 'Name' : 'ABC', 'CntNumber': 1,'CntMixer': 3,'DevicePositions': 'Right','AddComments': 'NA'},
        {'SrNo' : 2, 'Name' : 'DEF', 'CntNumber': 4,'CntMixer': 2,'DevicePositions': 'NA','AddComments': 'NA'},
        {'SrNo' : 3, 'Name' : 'XYZ', 'CntNumber': 2,'CntMixer': 5,'DevicePositions': 'Left','AddComments': 'NA'},
        [{'SrNo':4}]
     ]
    
  • 您检查天气数组的方法是否包含对象或数组

    isObject(values){
       if (!Array.isArray (values) ){ return true;}
       else{ return false; }
    }
    
  • 您的模板HTML是

    <div *ngFor= "let section of arrRowData ">
          <ul>
               <li *ngIf="isObject(section); else printVal">
                    <span> This is Object {{section |json}} </span>
               </li>
          </ul>
          <ng-template #printVal>
                <li>  This is Array {{section | json}} </li>
          </ng-template>  
    </div>
    

如果你只想检查 object 是否存在,你可以使用 Array#some:

const arrRowData = [
  {
    SrNo: 1,
    Name: 'ABC',
    CntNumber: 1,
    CntMixer: 3,
    DevicePositions: 'Right',
    AddComments: 'NA'
  },
  {
    SrNo: 2,
    Name: 'DEF',
    CntNumber: 4,
    CntMixer: 2,
    DevicePositions: 'NA',
    AddComments: 'NA'
  },
  {
    SrNo: 3,
    Name: 'XYZ',
    CntNumber: 2,
    CntMixer: 5,
    DevicePositions: 'Left',
    AddComments: 'NA'
  }
];
const objVenIns = {
  CntNumber: 4,
  CntMixer: 2,
  DevicePositions: 'NA',
  AddComments: 'NA'
};

const areObjectEquals = (obj1, obj2) =>
  obj1.CntMixer === obj2.CntMixer &&
  obj1.CntNumber === obj2.CntNumber &&
  obj1.DevicePositions === obj2.DevicePositions &&
  obj1.DevicePositions === obj2.DevicePositions &&
  obj1.AddComments === obj2.AddComments;

const objectExistsInArray = arrRowData.some(row => areObjectEquals(row, objVenIns));

console.log('objectExistsInArray?', objectExistsInArray);


PS1:我强烈建议您创建一个界面来输入您的 arrayobjectmethods

PS2:对于一种更动态的方法,您不需要告知要检查哪些属性,也不需要关心其属性是否发生变化,我建议您查看在 .

如果你想获取所有存在的对象,那么你可以过滤它:

let objVenIns = {
'CntNumber': 4,
'CntMixer': 2,
'DevicePositions': 'NA',
'AddComments': 'NA',
};


let arrRowData = [
{'SrNo' : 1, 'Name' : 'ABC', 'CntNumber': 1,'CntMixer': 3,'DevicePositions': 'Right','AddComments': 'NA'},
{'SrNo' : 2, 'Name' : 'DEF', 'CntNumber': 4,'CntMixer': 2,'DevicePositions': 'NA','AddComments': 'NA'},
{'SrNo' : 3, 'Name' : 'XYZ', 'CntNumber': 2,'CntMixer': 5,'DevicePositions': 'Left','AddComments': 'NA'}
];

const result = arrRowData.filter(f=>
f.CntMixer === objVenIns.CntMixer &&
  f.CntNumber === objVenIns.CntNumber &&
  f.DevicePositions === objVenIns.DevicePositions &&
  f.DevicePositions === objVenIns.DevicePositions &&
  f.AddComments === objVenIns.AddComments
);

console.log(result);
console.log(result.length > 0 ? 'exists' : 'no');