Javascript 如何防止for循环中的重复数据
我想知道防止重复数据进入新阵列的最佳方法是什么。我有一个服务调用,它返回相同的数组3次。我试图从数组中的对象内部获取一个数字,并将它们相加以创建一个“总计”数字(fullRentAmt),但由于数组返回了3次,所以我得到了总计*3。我在想.some()或.filter()可能在这里有用,但我从未使用过它们/我不确定如何在这里实现。谢谢你的帮助 我尝试了什么,但不起作用/新阵列没有填充: 组件Javascript 如何防止for循环中的重复数据,javascript,json,angular,Javascript,Json,Angular,我想知道防止重复数据进入新阵列的最佳方法是什么。我有一个服务调用,它返回相同的数组3次。我试图从数组中的对象内部获取一个数字,并将它们相加以创建一个“总计”数字(fullRentAmt),但由于数组返回了3次,所以我得到了总计*3。我在想.some()或.filter()可能在这里有用,但我从未使用过它们/我不确定如何在这里实现。谢谢你的帮助 我尝试了什么,但不起作用/新阵列没有填充: 组件 properties = []; fullRentAmt: number = 0;
properties = [];
fullRentAmt: number = 0;
const propertyDataSub = this.mainService.requestPropertyData()
.subscribe((pData: PropertyData[]) => {
if (pData) {
const propertyData = pData;
for (let i = 0; i < propertyData.length; i++) {
if (this.properties[i].propertyId !== propertyData[i].propertyId) {
this.properties.push(propertyData[i]);
}
}
for (let i = 0; i < this.properties.length; i++) {
this.fullRentAmt += this.properties[i].tenancyInformation[0].rentAmount;
}
});
我不是一个有角度的开发者,但我希望我的回答能帮助你 让for循环尽可能多地复制数据。您只需改变将内容从数组存储到 基本上,它与数组非常相似,它们是列表和可迭代的,与数组非常相似,唯一的区别是它们不允许重复 用法:
const properties=new Set()
属性。添加(“黄色”)
属性。添加(“蓝色”)
属性。添加(“橙色”)
console.log(属性)//黄色、蓝色、橙色
属性。添加(“蓝色”)
属性。添加(“蓝色”)
属性。添加(“蓝色”)
console.log(属性)//黄色、蓝色、橙色
for循环完成后,您可能希望将此集合转换为普通数组,您需要做的只是使用分解结构:
const propertiesArray=[…properties]
@YaYa是正确的。我添加这个是为了以角度显示正确的代码
properties = [];
fullRentAmt: number = 0;
const propertyDataSub = this.mainService.requestPropertyData()
.subscribe((pData: PropertyData[]) => {
if (pData && pData.length) {
let arrSet = new Set()
const propertyData = pData;
for (let i = 0; i < propertyData.length; i++) {
if (this.properties[i].propertyId !== propertyData[i].propertyId) {
arrSet.add(propertyData[i])
}
}
this.properties = Array.from(arrSet);
for (let i = 0; i < this.properties.length; i++) {
this.fullRentAmt += this.properties[i].tenancyInformation[0].rentAmount;
}
});
properties=[];
fullRentAmt:数字=0;
const propertyDataSub=this.mainService.requestPropertyData()
.订阅((pData:PropertyData[])=>{
if(pData&&pData.length){
设arrSet=newset()
常量属性数据=pData;
for(设i=0;i
您需要做的第一件事是修复服务器并返回列表一次
如果服务器超出您的能力范围,您可以将distinctUntilChanged
管道与前端的isEqual
方法结合使用。您可以自己实现,也可以使用库,如lodash
您也不必订阅,在模板中使用async
pipe
this.properties$=this.mainService.requestPropertyData()
.烟斗(
distinctUntilChanged(isEqual)//以某种方式提供isEqual函数
);
此.totalRentAmount$=properties$.pipe(
地图(getTotalRentAmount)
);
//可能在其他一些实用程序文件中:
export const getTotalRentAmount=(属性:Property[]):number=>{
返回属性
.map(property=>property.tenancyInformation.rentAmount)
.减少((总额,金额)=>总额+金额,0);
}
然后在模板中:
总租金金额:{{totalrentmount | async}
此外,如果您确实需要订阅组件,并且只对可观察对象的第一个发出值感兴趣,则可以使用first()
或take(1)
管道在第一个值之后自动取消订阅
this.mainService.requestPropertyData()
.烟斗(
first()//或take(1)
)
.subscribe(properties=>this.properties=properties);
但为什么后端会返回3次?是Angular的3次请求还是后端的错误?
properties = [];
fullRentAmt: number = 0;
const propertyDataSub = this.mainService.requestPropertyData()
.subscribe((pData: PropertyData[]) => {
if (pData && pData.length) {
let arrSet = new Set()
const propertyData = pData;
for (let i = 0; i < propertyData.length; i++) {
if (this.properties[i].propertyId !== propertyData[i].propertyId) {
arrSet.add(propertyData[i])
}
}
this.properties = Array.from(arrSet);
for (let i = 0; i < this.properties.length; i++) {
this.fullRentAmt += this.properties[i].tenancyInformation[0].rentAmount;
}
});