Странная ошибка присвоения массива Angular 2+? - PullRequest
0 голосов
/ 14 декабря 2018

Вопрос довольно простой, но я не смог найти ответ.Когда я пытаюсь переназначить элемент массива объектов другому объекту, который соответствует описанию, ничего не происходит, но когда я сначала устанавливаю элемент на 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 голосов
/ 14 декабря 2018

Когда вы делаете это

      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))
0 голосов
/ 14 декабря 2018

индекс, i.name[0] он используется при внедрении старой школы для циклов.то есть (for(var i=0, i > length, i++).

Но for (const i of value) является встроенным методом, и когда вы вызываете i, он уже имеет значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...