Javascript 如何防止for循环中的重复数据

Javascript 如何防止for循环中的重复数据,javascript,json,angular,Javascript,Json,Angular,我想知道防止重复数据进入新阵列的最佳方法是什么。我有一个服务调用,它返回相同的数组3次。我试图从数组中的对象内部获取一个数字,并将它们相加以创建一个“总计”数字(fullRentAmt),但由于数组返回了3次,所以我得到了总计*3。我在想.some()或.filter()可能在这里有用,但我从未使用过它们/我不确定如何在这里实现。谢谢你的帮助 我尝试了什么,但不起作用/新阵列没有填充: 组件 properties = []; fullRentAmt: number = 0;

我想知道防止重复数据进入新阵列的最佳方法是什么。我有一个服务调用,它返回相同的数组3次。我试图从数组中的对象内部获取一个数字,并将它们相加以创建一个“总计”数字(fullRentAmt),但由于数组返回了3次,所以我得到了总计*3。我在想.some()或.filter()可能在这里有用,但我从未使用过它们/我不确定如何在这里实现。谢谢你的帮助

我尝试了什么,但不起作用/新阵列没有填充:

组件


    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;
      }
  });