这个问题很简单,但我一直找不到答案。 当我尝试将对象数组的元素重新分配给另一个适合描述的对象时,什么也没有发生,但是当我首先将该元素设置为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)。两项检查均得出相同的结果。
答案 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
此外,如果仅按servers
对name
数组进行排序,则使用内置方法可能会容易得多:
value.sort((x, y) => x.name.localeCompare(y.name))