Угловой подсчет общего количества элементов в массиве без замедления - PullRequest
0 голосов
/ 05 октября 2018

В настоящее время я проверяю checkDevice(obj), чтобы увидеть, присутствует ли значение или нет ... Что мне также нужно, отдельно, это получить счет.Сколько раз Устройство появляется в Array.

component.ts

  public checkDevice(obj) {
    if (obj == null || obj == '' || obj == '-1') {
      return false;
    } else {
      return true;
    }
  }

component.html

<div class="float-left" *ngIf="checkDevice(obj.device_token) == true">
   <i class="fa fa-icon" aria-hidden="true"></i>
</div>

Редактировать PHP-скрипт, который выполняет запрос БД

$users = array();
if ($results = $dbh->runQuery($sql)) {

  foreach ($results as $key=>$row){
    $users[$row['user_id']][] = array('user_id'=>$row['user_id'],
      'user_token' => $row['utoken'],
      'device_token' => $row['device'],
      'group_name' => $row['group_name']);
  }
}

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Я рекомендую вам не использовать функции для привязки данных в вашем HTML, это может иметь проблемы с производительностью, поскольку ваши функции будут вызываться для проверки каждый раз.

Я думаю, что у вас уже есть массивс вашими устройствами, и вы перебираете в ngFor .

Рекомендуются следующие шаги:

  • Создание очищенного массива, в котором вы очищаете все устройства токеном, равным нулю или пустым
  • Используйте этот массив дляпривязать его к ngFor (вы будете уверены, что токен загружен)

Решив две вещи:

  • Проблема с производительностьюу вас есть привязка функции к * ngIf
  • . Вы решите проблему подсчета, поскольку у вас будет новый массив со всеми элементами, имеющими токен.
0 голосов
/ 05 октября 2018

Если вы просто хотите проверить, существует ли свойство объекта, то вам нужно выполнить что-то вроде этого:

<div class="float-left" *ngIf="obj.device_token">
  <i class="fa fa-icon" aria-hidden="true"></i>
</div>

Если вы хотите получить вхождение объекта устройства в массив, попробуйтеэто решение:

getDeviceOccurrence(deviceArray: Array<object>, device: object): number {
  return deviceArray.reduce((accumulator: number, currentValue: object) => {
    if (_.isEqual(currentValue, device)) {
      return accumulator = accumulator + 1;
    }
    return accumulator;
  }, 0);
}

Примечания к предлагаемому решению:

  • Для сравнения объектов проще импортировать lodash и использоватьее isEqual функция.
  • Функция принимает два параметра.Первый - это массив, содержащий устройства.Второе - это устройство.Функция вернет число, которое является вхождением объекта устройства в массив.
  • В этом решении используется уменьшение

Использование в шаблоне:

<span>{{ getDeviceOccurrence(devices, device) }}</span>
0 голосов
/ 05 октября 2018

Я думаю, вы также можете написать этот код.

<div class="float-left" *ngIf="obj.device_toke">
   <i class="fa fa-icon" aria-hidden="true"></i>
</div>
...