Javascript 角度2+;数组异常错误?

Javascript 角度2+;数组异常错误?,javascript,angular,typescript,angular7,Javascript,Angular,Typescript,Angular7,这个问题很简单,但我还没有找到答案。 当我尝试将对象数组中的一个元素重新分配给另一个符合描述的对象时,什么都不会发生,但是当我首先将元素设置为null,然后重新分配它时,它会起作用。 以下是我正在使用的对象列表: servers = [ { instanceType: 'medium', name: 'Production', status: 'stable', started: new Date(15, 1, 2017) }, { instanceType: 'large'

这个问题很简单,但我还没有找到答案。 当我尝试将对象数组中的一个元素重新分配给另一个符合描述的对象时,什么都不会发生,但是当我首先将元素设置为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;
  }

}
以下是可行的方法:

从'@angular/core'导入{Pipe,PipeTransform};
@烟斗({
名称:“排序”
})
导出类SortPipe实现PipeTransform{
转换(值:any,args?:any):any{
用于(价值常数i){
for(value.slice的常数j(value.indexOf(i)+1)){
如果(i.name>j.name){
常数index1=值indexOf(i);
常数index2=值indexOf(j);
值[index1]=null;
值[index2]=null;
值[index1]=j;
值[index2]=i;
}
}
}
返回值;
}
}
这不是一个严重的问题,但我现在很好奇为什么它一方面不起作用,另一方面却起作用。 谢谢你抽出时间


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

索引,
i.name[0]
在实现旧的for循环时使用它。i、 e.
(对于(变量i=0,i>长度,i++)

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

当您这样做时

      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

此外,如果您只是按照
名称对
服务器
数组进行排序,那么使用内置方法可能会容易得多:

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

很抱歉,似乎没有彻底检查代码,但这一部分不会影响结果。我尝试了两种方法(I.name>j.name)和if(I.name[0]>j.name[0])。我会编辑文章以保持一致。非常感谢,这解决了“谜”。我猜这可能很简单,但无论如何都会遇到这些问题。