Angular2删除/阻止数组

时间:2017-07-13 20:48:19

标签: angular typescript lodash

我有一个订阅subject的组件,它返回员工记录并将它们放入数组中。

importResults: ImportResults[] = [];

constructor(
    private _massEmpService: MassEmpService
) {
}

ngOnInit() {
    // Subscribe to our subject that lets us know about the added employees
    this._massEmpService.importedData.subscribe(obj => {
        if (obj) {
            // Ensure that we have unique results in our imported data
            this.importResults.push(_.uniqBy(obj, 'QID'));
        }
    });
}

我的问题是,每次单击我的按钮并且此订阅接收数据时,它会将新数据与已存在的数据一起推送,而不是仅添加不存在的记录。

以下是收到的单条记录的示例(我输入了一个用户名并点击了搜索)

enter image description here

以下是添加一位额外用户的示例,将前一位用户留在搜索栏中。

enter image description here

如您所见,第一个数组是原始搜索结果。第二个数组包含第一个员工和新员工。

我的预期结果是有一个包含唯一对象的数组。这意味着我的例子应该有2条记录,因为第一个雇员被搜查了两次,因为该对象已经存在,所以他不应该被推入或包含在数组中。

我是否正确使用此lodash功能? QID也是对象中唯一的有效密钥(未图示)。

6 个答案:

答案 0 :(得分:2)

你可以找到第一个uoy对象,无论你想要什么,如果没有找到,然后推它。例如

importResults: ImportResults[] = [];
import * as _ from 'lodash';
constructor(
    private _massEmpService: MassEmpService
) {
}

ngOnInit() {
    // Subscribe to our subject that lets us know about the added employees
    this._massEmpService.importedData.subscribe(obj => {
        if (obj) {
            // Ensure that we have unique results in our imported data
            const keyExists= this._find((obj);
                if(keyExists){
                   this.importResults.push(obj);
                }
        }
    });
   }

在组件中创建查找功能

  private _find(cur_obj: any): any{
                return _.find(this.importResults, function (importResult: any): boolean {
                   return importResult.QID === cur_obj.QID;
                });
 }

这是一个例子。您可以根据对象进行更改

答案 1 :(得分:2)

您可以使用RxJS'distinct运算符尝试这样的操作,而不是自己手动检查唯一性:

this._massEmpService.importedData
   .filter(obj => obj)
   .distinct(src => src.QID)
   .subscribe(obj => this.importResults.push(obj));

答案 2 :(得分:2)

删除数组中重复项的简单方法是: 在这里,我删除了具有重复名称的项目



var myArray= [ { 'name': 'Mac'}, {'name': 'Mac'}, {'name': 'John'} ,{'name': 'Edward'}];

console.log('----------------Before removing-------------');
console.log(myArray);
 myArray.forEach((item, index) => {
            if (index !== myArray.findIndex(i => i.name === item.name)) {
                myArray.splice(index, 1);
            }
            
        });
console.log('---------------After removing------------------');
console.log(myArray);




答案 3 :(得分:0)

每次importResults运行时,您都可以重置subscription变量。只需使用以下内容替换{}中的subscription()



{
  if (obj) {
    this.importResults = [];
    // Ensure that we have unique results in our imported data
    this.importResults.push(_.uniqBy(obj, 'QID'));
  }




答案 4 :(得分:0)

此代码并不真正适用于所有对象属性方案。我尝试向数组添加更多属性,但它并没有真正删除重复项。

var myArray= [ { 'name': 'Mac', 'id': '1', 'group_id': 66}, 
{'name': 'Mac', 'id': '2',  'group_id': 55},
{'name': 'John', 'id': '3',  'group_id': 66} ,
{'name': 'Edward', 'id': '4',  'group_id': 55}, 
{'name': 'Edward', 'id': '5',  'group_id': 70}];

console.log('----------------Before removing-------------');
console.log(myArray); myArray.forEach((item, index) => {
            if (index !== myArray.findIndex(i => i.group_id === item.group_id)) {
                myArray.splice(index+1, 1);
            }

        });
 console.log('---------------After removing------------------');
 console.log(myArray);

所以我尝试了这段代码,这确实有效:

const data = [{name: 'AAA'}, {name: 'AAA'}, {name: 'BBB'}, {name: 'AAA'}];
function removeDuplicity(datas){
    return datas.filter((item, index,arr)=>{
    const c = arr.map(item=> item.name);
    return  index === c.indexOf(item.name)
  })`enter code here`
}

console.log(removeDuplicity(data))

答案 5 :(得分:0)

您可以尝试以下对我有用的代码。

第一个示例,用于确定数组是否具有重复的对象。

let hasDuplicate = false;
this.items.forEach((el) => {
            if (this.items.filter(x => x === el).length > 1) {
                this.hasDuplicate = true;
                return;
            }
        });

第二个从数组中获取唯一对象的示例。

let uniqueArr = [];
this.items.forEach((el) => {
            if (this.items.filter(x => x === el).length === 1) {
                this.uniqueArr.push(el);
            }
        });

我希望它将对某人有所帮助。