我有一个订阅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'));
}
});
}
我的问题是,每次单击我的按钮并且此订阅接收数据时,它会将新数据与已存在的数据一起推送,而不是仅添加不存在的记录。
以下是收到的单条记录的示例(我输入了一个用户名并点击了搜索)
以下是添加一位额外用户的示例,将前一位用户留在搜索栏中。
如您所见,第一个数组是原始搜索结果。第二个数组包含第一个员工和新员工。
我的预期结果是有一个包含唯一对象的数组。这意味着我的例子应该有2条记录,因为第一个雇员被搜查了两次,因为该对象已经存在,所以他不应该被推入或包含在数组中。
我是否正确使用此lodash
功能? QID
也是对象中唯一的有效密钥(未图示)。
答案 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);
}
});
我希望它将对某人有所帮助。