我正面临着意想不到的情况。 我有一些对象(数组)。 那些有一个属性break ,即boolean break值取决于情况,但在if语句、 forfor of循环中for比较时,它始终为 false。 我试图通过使用 ==、=== 和 only 属性来更改 if 的样式,但即使某些对象的值为true ,它们也会产生相同的结果。 简单地说,当迭代对象数组时,对象的break属性变为 false ,即使它为true 语言是 TypeScript。

假设调用了 getRoute() 方法。

以下是方法

import { Injectable } from '@angular/core';
import { of, EMPTY, concat } from 'rxjs';
import { HttpService } from '../http.service';
import { take, tap, map, last } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class RouteService {
  activities;
  distanceDB;
  cityFilter = [];
  route: any[];

  constructor(private httpService: HttpService) { }

  setActvities(activities) {
    this.activities = activities;
  }

  getRoute() {
    if (this.activities) {
      return concat(
          this.sortUpActivities(),
          this.calculateBreaks(),
          this.allocateNights()
        ).pipe(
          last()
        );
    }

    return EMPTY;
  }

  /* sort up activities according to city */
  private sortUpActivities() {
    const route = [];
    let counter = 0;

    for (let i = 0; i < this.activities.length; i++) {
      for (let j = 0; j < this.activities[i].length; j++) {
        const city = route.find(r => {
          return r.cityCode == this.activities[i][j].cityCode;
        });

        if (!city) {
          route[counter] = {}
          Object.defineProperty(route[counter], 'break', {
            value: false,
            writable: true
          });

          route[counter].activities = [this.activities[i][j]];
          route[counter].cityCode = this.activities[i][j].cityCode;
          counter++;
        } else {
          city.activities.push(this.activities[i][j]);
        }
      }
    }

    this.route = route;
    return of(this.route);
  }

  /* cacluate breaks required in each city */
  private calculateBreaks() {
    let timeSincePreviousBreak = 7;
    let transitTime = 0;

    return this.httpService.getCityToCity(this.cityFilter).pipe
    (
      take(1),

      tap<any[]>(cityToCity => {
        for (let i = 0; i < this.route.length; i++) {
          let totalActivityTime = 0;;
          for (const ea of this.route[i].activities) {
            totalActivityTime += ea.duration;
          }

          if (this.route[i+1]) {
            const cityToCityInfo =
              cityToCity.find(c => c.from == this.route[i].cityName
                && c.to == this.route[i+1].cityName) ||
              cityToCity.find(c => c.from == this.route[i+1].cityName
                && c.to == this.route[i].cityName);

              if (cityToCityInfo) {
                transitTime = cityToCityInfo.time || 0; // `|| 0` because of DB probable problem
              } else {
                transitTime = 0; // `|| 0` because of probable DB problem
              }
          } else {
            transitTime = 0; // because it is perhapse last city
          }

          const totalTime = timeSincePreviousBreak + totalActivityTime + transitTime;

          this.route[i].activityTime = totalActivityTime;
          if (totalTime >= 9) {
            this.route[i].break = true;
            timeSincePreviousBreak = transitTime;
          } else {
            this.route[i].break = false;
            timeSincePreviousBreak = totalTime;
          }
        }
      }),

      map(cityToCity => { return this.route })
    );
  }


  /* allocate nights according to breaks */
  private allocateNights() {
    for (let i = 0; i < this.route.length; i++) {
      if (this.route[i].break) {
        Object.defineProperty(this.route[i], 'nights', {
          value: 0,
          writable: true
        });

        if (this.route[i].activityTime <= 7) {
          this.route[i].nights = 1;
        } else if (this.route[i].activityTime <= 14) {
          this.route[i].nights = 2;
        } else {
          this.route[i].nights = 3;
        }
      } else {
        console.log(this.route[i].break);
      }
    }

    return of(this.route);
  }
}

以下是日志

Angular is running in the development mode. Call enableProdMode() to enable the production mode. core.js:38781
(5) […]
​
0: {…}
​​
activities: Array [ {…} ]
​​
activityTime: 3
​​
break: true
​​
cityCode: "ELL"
​​
<prototype>: Object { … }
​
1: {…}
​​
activities: Array [ {…} ]
​​
activityTime: 5
​​
break: false
​​
cityCode: "NUW"
​​
<prototype>: Object { … }
​
2: {…}
​​
activities: Array [ {…}, {…} ]
​​
activityTime: 10
​​
break: true
​​
cityCode: "KAN"
​​
<prototype>: Object { … }
​
3: {…}
​​
activities: Array [ {…} ]
​​
activityTime: 5
​​
break: false
​​
cityCode: "YAL"
​​
<prototype>: Object { … }
​
4: {…}
​​
activities: Array(3) [ {…}, {…}, {…} ]
​​
activityTime: 12
​​
break: true
​​
cityCode: "GAL"
​​
<prototype>: Object { … }
​
length: 5
​
<prototype>: Array []
route.service.ts:118:12

----------------------------------------------------
false 5 route.service.ts:135:16
----------------------------------------------------
(5) […]
​
0: {…}
​​
activities: Array [ {…} ]
​​
activityTime: 3
​​
break: true
​​
cityCode: "ELL"
​​
<prototype>: Object { … }
​
1: {…}
​​
activities: Array [ {…} ]
​​
activityTime: 5
​​
break: false
​​
cityCode: "NUW"
​​
<prototype>: Object { … }
​
2: {…}
​​
activities: Array [ {…}, {…} ]
​​
activityTime: 10
​​
break: true
​​
cityCode: "KAN"
​​
<prototype>: Object { … }
​
3: {…}
​​
activities: Array [ {…} ]
​​
activityTime: 5
​​
break: false
​​
cityCode: "YAL"
​​
<prototype>: Object { … }
​
4: {…}
​​
activities: Array(3) [ {…}, {…}, {…} ]
​​
activityTime: 12
​​
break: true
​​
cityCode: "GAL"
​​
<prototype>: Object { … }
​
length: 5
​
<prototype>: Array []
route.service.ts:139:12

  ask by Ahmad Raza translate from so

本文未有回复,本站智能推荐:

1回复

如何在for-of或maparray.slice中转换for循环whitarray.slice以生成col和row?

我在 Angular8 中遇到了问题。 我需要将数组的for循环转换for for-of或array.map 。 我有这个代码,我传递了一个对象数组,我需要将它分成 col 和 row 数组以进行可视化。 我从对象 whit col = 2 的输出; 行 = 2; : 输出是正确的,但 tslin
1回复

在for循环中将布尔值计算为true或false

我遇到的问题与使用布尔 fvalue 并在字符串包含字符串无限的情况下将其转换为真或假有关。 问题是我还附加了对值区域的订阅,并且我需要使用 *NgIf 来更改使用此布尔值的页面呈现。 这就是问题所在。
1回复

循环遍历数组对象以检查值匹配仅适用于第一次迭代,后续迭代失败

我在测验应用程序中有一个对象,用于存储问题编号和用户答案。 我有一个循环遍历对象的函数,以检查对象中是否存在问题编号。 如果是,则更新用户答案,如果不是,则进行新条目。 我的问题是对于我可以添加的第一个条目,检查问题编号是否存在并更新用户答案,但对于所有其他条目,它无法匹配问题编号,因此所有更新都显
3回复

检查对象数组中是否存在对象属性

如果我有以下对象数组: 有没有办法使用*ngFor HTML 页面上的数组来检查特定的lastName属性是否已经存在? 例如:
1回复

此条件将始终返回'false',因为类型'SingleDataSet'和'number'没有重叠ng2chart[angular]

大家好,我正在尝试检查该数组是否包含 0,如果它有 0,那么我想添加空间来代替 0 但我得到的错误条件总是错误的,如下图所示,请帮我解决它截屏
1回复

在继续之前解决for循环中的多个承诺

我有一个 angular 11 组件,它循环遍历页面元素,并将它们从 html > canvas > images 转换。 然后我将它们附加到表单中。 我的问题是承诺总是在“完成”控制台日志运行后解决。 在循环之后继续执行脚本之前,如何await所有generateCanvasFromH
2回复

如何使用角度在for循环中使用正确的过滤器

我有这个数组["Let me introduce", "Our Values"] 我使用这个代码: 显示错误 来自 this.CrewChannelContents 的数据 更新代码: 错误 错误错误:未捕获(承诺):类型错误:无法读取未定义的属性“推送”类型错误:无法读取未定义的属性“推送” 在
2回复

如何在Angular中访问嵌套对象的属性?

我有这个模型类。 在我的 display.component.ts 中,我有这个函数来填充我的 Drivefunction[] 如您所见,我尝试使用 console.log 来查看 json 对象是否已正确填充 所有的对象和嵌套的对象都被填满了! 在我的 HTML 中,我有一个带有 drivefun