【问题标题】:Angular 2+ array asignment weird bug?Angular 2+ 数组分配奇怪的错误?
【发布时间】:2019-05-15 17:09:39
【问题描述】:

这个问题很简单,但我一直找不到答案。 当我尝试将对象数组的元素重新分配给符合描述的另一个对象时,什么也没有发生,但是当我首先将元素设置为 null 然后重新分配它时,它可以工作。 这是我正在使用的对象列表:

servers = [
{
  instanceType: 'medium',
  name: 'Production',
  status: 'stable',
  started: new Date(15, 1, 2017)
},
{
  instanceType: 'large',
  name: 'User Database',
  status: 'stable',
  started: new Date(15, 1, 2017)
},
{
  instanceType: 'small',
  name: 'Development Server',
  status: 'offline',
  started: new Date(15, 1, 2017)
},
{
  instanceType: 'small',
  name: 'Testing Environment Server',
  status: 'stable',
  started: new Date(15, 1, 2017)
}

];

这是行不通的方法:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'sort'
})
export class SortPipe implements PipeTransform {

  transform(value: any, args?: any): any {
    for (const i of value) {
      for (const j of value.slice(value.indexOf(i) + 1)) {
        if (i.name > j.name) {
          value[value.indexOf(i)] = j;
          value[value.indexOf(j)] = i;
        }
      }
    }
    return value;
  }

}

这是行之有效的方法:

import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
  name: 'sort'
})
export class SortPipe implements PipeTransform {

  transform(value: any, args?: any): any {
    for (const i of value) {
      for (const j of value.slice(value.indexOf(i) + 1)) {
        if (i.name > j.name) {
          const index1 = value.indexOf(i);
          const index2 = value.indexOf(j);
          value[index1] = null;
          value[index2] = null;
          value[index1] = j;
          value[index2] = i;
        }
      }
    }
    return value;
  }

}

这不是一个严重的问题,但我现在很好奇为什么它不能以一种方式工作,而是以另一种方式工作。 感谢您的宝贵时间!

编辑 1: 将 (i.name[0] > j.name[0]) 更改为 (i.name > j.name) 以保持一致性。两次检查都给出了相同的结果。

【问题讨论】:

    标签: javascript angular typescript angular7


    【解决方案1】:

    索引i.name[0] 在您实现老式 for 循环时使用。即(for(var i=0, i > length, i++)

    但是for (const i of value)是一个内置方法,当你调用i时它已经有了值。

    【讨论】:

    • 对不起,似乎没有彻底检查代码,但这部分不影响结果。我尝试使用 (i.name > j.name) 和 if (i.name[0] > j.name[0]) 两种方法。我将编辑帖子以保持一致。
    【解决方案2】:

    当你这样做时

          value[value.indexOf(i)] = j;
          value[value.indexOf(j)] = i;
    

    第二行的value.indexOf(j) 返回原来的value.indexOf(i),因为您已经将j 放入了那个槽。所以你最终得到了

          value[value.indexOf(i)] = i;
    

    这是一个无操作。

    如果循环时需要数组值和索引一起使用,可以使用

     for (let [index, value] of array.entries())
    

    而不仅仅是for..of

    另外,如果您只是按nameservers 数组进行排序,则使用内置方法可能会更容易:

     value.sort((x, y) => x.name.localeCompare(y.name))
    

    【讨论】:

    • 非常感谢,解开了“谜团”。我猜这会很简单,但无论如何总是被这些东西难住。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2019-10-01
    • 1970-01-01
    相关资源
    最近更新 更多