如果foreach内的/ else条件

时间:2019-03-07 13:00:46

标签: javascript angular typescript

我正在开发一个有角度的项目。 我有一个表文件,如果要正确,我想将每个元素与一个数据值进行比较,我会做声明,否则我会做另一次比较,但是我的问题是,即使数据是正确的,它也总是会获取所有表,并且应该在其他很短的时间。 请如何避免这种情况。

这是我的代码:

if (this.data) {
  this.imgNotFoundText = '';
  this.data.package.files.forEach(element => {
    i++;
    this.picture = '';
    if (element.name == this.data.properties.Name) {
      this.picture = 'picOne.png'
    }
    if (i == this.data.package.files.length && this.picture == '') {
      this.picture = './../assets/img/notFound.jpg'
    }
  });
}

3 个答案:

答案 0 :(得分:5)

我看到了两个可能的问题:

  1. 似乎怀疑总是在循环中无条件执行this.picture = '';。如果要执行此操作,则最好只查看数组中的最后一个条目。您可能想将其移到forEach调用之前

  2. 您已经引用了else,但是您的代码中没有else。您连续有两个if,但是第一个if的结果对第二个{根本没有任何影响。您可能想要else if。然后,如果第一个if中的条件为true,则不执行第二个if

因此,如果这两个猜测都正确:

if (this.data) {
    this.imgNotFoundText = '';
    this.picture = '';
    this.data.package.files.forEach(element => {
        i++;
        if (element.name == this.data.properties.Name) {
            this.picture = 'picOne.png'
        } else if (i == this.data.package.files.length && this.picture == '') {
            this.picture = './../assets/img/notFound.jpg'
        }
    });
}

旁注:您尚未显示i的初始化方式,但是如果用于跟踪forEach当前条目的索引,则无需:forEach会收到作为第二个参数:

if (this.data) {
    this.imgNotFoundText = '';
    this.picture = '';
    this.data.package.files.forEach((element, index) => {
    // -----------------------------^^^^^^^^^^^^^^^^
        if (element.name == this.data.properties.Name) {
            this.picture = 'picOne.png'
        } else if (index == this.data.package.files.length && this.picture == '') {
    // ------------^^^^^
            this.picture = './../assets/img/notFound.jpg'
        }
    });
}

您还可能希望完全避免使用第二个if,只需在循环之前指定默认值“ not found”即可。

if (this.data) {
    this.imgNotFoundText = '';
    const {files} = this.data.package;
    this.picture = files.length ? './../assets/img/notFound.jpg' : '';
    files.forEach(element => {
        if (element.name == this.data.properties.Name) {
            this.picture = 'picOne.png'
        }
    });
}

我假设this.picture中没有条目时,''应该是files,如果至少有一个条目,则应该是“未找到”图像。如果找到匹配项,循环将覆盖它。

从那里继续,除非files中可以有多个具有相同name的条目,否则您可能要在第一个匹配项之前停止。所以:

if (this.data) {
    this.imgNotFoundText = '';
    const {files} = this.data.package;
    this.picture = files.length ? './../assets/img/notFound.jpg' : '';
    for (const {name} of files) {
        if (name == this.data.properties.Name) {
            this.picture = 'picOne.png'
            break;
        }
    }
}

答案 1 :(得分:0)

不确定您的目标是什么,但是您只是遍历列表并每次设置图片值,这意味着您将获得最后一个元素的图片值。

如果您的目标是为没有文件的元素显示“未找到”图片,则需要具有一组反映文件数组的图片(或向每个文件添加属性图片)。 / p>

答案 2 :(得分:0)

看起来您可以使用Array.prototype.some

if (this.data) {
  this.imgNotFoundText = '';
  this.picture = this.data.package.files.some(
  (element) => element.name === this.data.properties.Name
  ) ? 'picOne.png' : './../assets/img/notFound.jpg'
}

如果data.package.files中的任何项目具有与this.data.properties.Name相同的名称,它将返回picOne.png

或返回notFound.jpg

尽管可以