Как изменить значение BehaviorSubject с помощью map / filter / find / findIndex в angular - PullRequest
0 голосов
/ 14 апреля 2020

TS

  arrData = new BehaviorSubject<any>([]);

  ngOnInit() {
    const dataArr1 = [
      {
        id: '1',
        name: 'Room1',
        spinning: true
      },
      {
        id: '2',
        name: 'Room2',
        spinning: true
      },
      {
        id: '3',
        name: 'Room3',
        spinning: true
      },
      {
        id: '4',
        name: 'Room4',
        spinning: true
      }
    ];

    this.arrData.next(dataArr1);

    const url = { id: '2', name: 'Room2', link: '/api/conditions'}
    const arr = new Array();
    arr.push(url);

    this.arrData.value.map((item: any) => {
      return {
        id: item.id,
        name: item.name,
        spinning: arr.findIndex(e => {
          return e.id === item.id
        }) === -1
      }
    });
    console.log(this.arrData.value);
  }

вот пример вывода: https://stackblitz.com/edit/angular-msovvq?file=src / app / app.component.ts

То, что я пытаюсь сделать здесь, это изменить значение вращения на false.

в примере есть объект данных { id: 2, name: 'Room2' }, затем я извлекаю sh, чтобы сделать его массивом.

, где я использовал findIndex, где dataArr1 id === arr id, но проблема здесь в том, что оно не меняет значение вращения на false для dataArr1.

оно все равно.

[
      {
        id: '1',
        name: 'Room1',
        spinning: true
      },
      {
        id: '2',
        name: 'Room2',
        spinning: true
      },
      {
        id: '3',
        name: 'Room3',
        spinning: true
      },
      {
        id: '4',
        name: 'Room4',
        spinning: true
      }
    ];

это должно быть так.

[
      {
        id: '1',
        name: 'Room1',
        spinning: true
      },
      {
        id: '2',
        name: 'Room2',
        spinning: false
      },
      {
        id: '3',
        name: 'Room3',
        spinning: true
      },
      {
        id: '4',
        name: 'Room4',
        spinning: true
      }
    ];

вращение Room2 изменится на false.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Использование loda sh

let tmp = [
      {
        id: '1',
        name: 'Room1',
        spinning: true
      },
      {
        id: '2',
        name: 'Room2',
        spinning: true
      },
      {
        id: '3',
        name: 'Room3',
        spinning: true
      },
      {
        id: '4',
        name: 'Room4',
        spinning: true
      }
    ];

Поскольку мы используем только идентификатор, чтобы найти:

let url =  { id: '2', name: 'Room2', link: '/api/conditions'}

let _tmp_row= _.find(tmp,{id:url['id']})
_tmp_row.spinning = false

Как только вы найдете элемент в соответствии с вашим шаблоном Вы можете изменить свойство объекта в соответствии с вашими предпочтениями. Поскольку этот объект не клонирован, он будет напрямую обновлять изменения в основном массиве объектов.

1 голос
/ 14 апреля 2020

Я предлагаю вам использовать карту вместе с таким фильтром. Карта и фильтр возвращают новый массив, а не изменяют само значение, поэтому свяжите результат с переменной.

dataArr1 = dataArr1.map(item => {
  return {
    id: item.id,
    name: item.name,
    spinning: dataArr2.findIndex(e => {
      return e.id === item.id
    }) === -1
  }
})

Это результат, это то, что вы ожидали?

[
  {
    "id": "1",
    "name": "Room1",
    "spinning": false
  },
  {
    "id": "2",
    "name": "Room2",
    "spinning": false
  },
  {
    "id": "3",
    "name": "Room3",
    "spinning": false
  },
  {
    "id": "4",
    "name": "Room4",
    "spinning": true
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...