À l'aide de Angular6 Mat-Tableau dynamiquement

Je suis l'élaboration d'un Angulaires application qui exige que je l'affichage des données qui-je le récupérer à partir d'une API. Car je ne sais pas exactement quelles sont les données que je voudrais récupérer, et aussi c'est un modèle que j'ai besoin de l'utiliser pour différentes tables, j'ai besoin de le faire à la fois de générer des colonnes dynamiquement, mais aussi de remplir chaque cellule trop.

Le JSON-je récupérer et j'ai besoin d'imprimer dans le tableau est similaire à ceci:

[
    {
        "attributes": [],
        "brandReference": "f805a08df4c236ddb431e14a38419690",
        "computedPOS": "BEXFY_HEADQUARTERS",
        "deviceType": 1,
        "friendlyName": "BEXFY_TRANSPARENT_LED",
        "id": "953e9414d7a51e8-e0-681def0b02b5",
        "isMonitored": true,
        "location": "entrance",
        "posReference": "78fcef0f12993d52b2d2906dc4ce48d8",
        "timetable": [],
        "timezone": "Europe/Madrid"
    },
    {
        "attributes": [],
        "brandReference": "185fd549-4410-462b-a610-fe6b61c91cf6",
        "comments": "",
        "computedPOS": "BEXFY_HEADQUARTERS",
        "deviceType": 1,
        "friendlyName": "BEXFY_AUDIO_OFICINA",
        "id": "79eaa7f5f6603809-e0-681def0b0290",
        "location": "",
        "posReference": "78fcef0f12993d52b2d2906dc4ce48d8",
        "timetable": [],
        "timezone": "Europe/Madrid"
    },
    {
        "attributes": [],
        "brandReference": "185fd549-4410-462b-a610-fe6b61c91cf6",
        "comments": "",
        "computedPOS": "BEXFY_HEADQUARTERS",
        "deviceType": 1,
        "friendlyName": ".BEXFY_AUDIO_ADRI",
        "id": "97bf675e3e237bcd-e0-681def0b029f",
        "location": "",
        "posReference": "78fcef0f12993d52b2d2906dc4ce48d8",
        "timetable": [],
        "timezone": "Europe/Madrid"
    }
]

Veuillez noter que la propriété de l'objet clés pourrait changer, donc je ne peux pas coder en dur quelque chose comme élément.friendlyName. - Je recevoir la clé des noms que je devrais utiliser à travers un tableau qui ressemble à ceci.

["friendlyName", "computedPOS", "location"]

Afin de le faire fonctionner, j'ai fait quelque chose comme cela.

<table mat-table [dataSource]="dataSource.data" class="mat-elevation-z8" style="width:90%%;margin:0 auto;">

  <ng-container *ngFor="let column of modelCols; let colIndex = index" matColumnDef={{nameCols[colIndex]}}>
    <th mat-header-cell *matHeaderCellDef> {{nameCols[colIndex]}}</th>
    {{log(modelCols)}}
    <div *ngFor="let column of modelCols;">
      <td mat-cell *matCellDef="let element">
        {{log(element[column])}}
        {{element[column]}}
      </td>
    </div>

  </ng-container>

  <tr mat-header-row *matHeaderRowDef="nameCols"></tr>
  <tr mat-row *matRowDef="let row; columns: nameCols;"></tr>
</table>

Le problème avec ceci, c'est qu'il en résulte une répétition de la première valeur ("friendlyName") au cours de chaque colonne de la ligne. Quelque chose comme cela.

enter image description here

Alors que le but de la façon de travailler est ceci:

enter image description here

0
2019-09-17 09:22:10
source
2 réponses

Une option serait d'abord convertir le "Date" à lasse s (mdy de lubridate), puis regroupés par 'ID', vérifiez si le 'Date' les valeurs sont between les 30 jours avant la "Date" à laquelle "Code" est "AAA" et dans un délai de 90 jours après que 'Date'

library(dplyr)
library(lubridate)
df1 %%>%%
   mutate(Date = mdy(Date)) %%>%%
    group_by(ID) %%>%%
    filter(between(Date, Date[Code == "AAA"] - days(30),
             Date[Code == "AAA"] + days(90)))
# A tibble: 10 x 4
# Groups:   ID [3]
#      ID Code  Date       Charge
#   <int> <chr> <date>      <dbl>
# 1     1 AAA   2016-01-01     23
# 2     1 BBB   2016-01-20     45
# 3     1 EEE   2016-01-02     43
# 4     1 FFF   2015-12-12     12
# 5     2 AAA   2017-01-07     12
# 6     2 BBB   2017-01-08     32
# 7     2 CCC   2017-01-06     12
# 8     3 AAA   2014-12-12     12
# 9     3 BBB   2014-12-18     12
#10     3 CCC   2014-12-01     13

données

df1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L), Code = c("AAA", "BBB", "CCC", "DDD", "EEE", "FFF", 
"AAA", "BBB", "CCC", "DDD", "AAA", "BBB", "CCC"), Date = c("1/1/2016", 
"1/20/2016", "2/19/2018", "1/20/2019", "1/2/2016", "12/12/2015", 
"1/7/2017", "1/8/2017", "1/6/2017", "10/10/2019", "12/12/2014", 
"12/18/2014", "12/1/2014"), Charge = c(23, 45, 23, 123, 43, 12, 
12, 32, 12, 12, 12, 12, 13)), class = "data.frame", row.names = c(NA, 
-13L))
+1
2019-09-17 10:08:34

Un Stata solution est la suivante:

clear
input byte id str3 code float date int charge
1 "AAA" 20454  23
1 "BBB" 20473  45
1 "CCC" 21234  23
1 "DDD" 21569 123
1 "EEE" 20455  43
1 "FFF" 20434  12
2 "AAA" 20826  12
2 "BBB" 20827  32
2 "CCC" 20825  12
2 "DDD" 21832  12
3 "AAA" 20069  12
3 "BBB" 20075  12
3 "CCC" 20058  13
end
format %%td date

bysort id (code): generate delta = date - date[1]
keep if delta >= -30 & delta <= 90

Résultats:

list, sepby(id)

     +----------------------------------------+
     | id   code        date   charge   delta |
     |----------------------------------------|
  1. |  1    AAA   01jan2016       23       0 |
  2. |  1    BBB   20jan2016       45      19 |
  3. |  1    EEE   02jan2016       43       1 |
  4. |  1    FFF   12dec2015       12     -20 |
     |----------------------------------------|
  5. |  2    AAA   07jan2017       12       0 |
  6. |  2    BBB   08jan2017       32       1 |
  7. |  2    CCC   06jan2017       12      -1 |
     |----------------------------------------|
  8. |  3    AAA   12dec2014       12       0 |
  9. |  3    BBB   18dec2014       12       6 |
 10. |  3    CCC   01dec2014       13     -11 |
     +----------------------------------------+
+1
2019-09-17 10:08:34

Voir d'autres questions sur les étiquettes