角2 +数组分配奇怪的bug?

时间:2018-12-14 12:13:48

标签: javascript angular typescript angular7

这个问题很简单,但我一直找不到答案。 当我尝试将对象数组的元素重新分配给另一个适合描述的对象时,什么也没有发生,但是当我首先将该元素设置为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)。两项检查均得出相同的结果。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

执行此操作

      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

此外,如果仅按serversname数组进行排序,则使用内置方法可能会容易得多:

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