如何从Angular上的json中提取数组

时间:2018-01-05 18:05:29

标签: arrays json angular observable

我正在使用angular2(第5版)。 我发一个http请求回来json。 我知道如何访问和使用值,但不知道数组。  而且我没有找到如何提取元素内部的两个数组。

这里是我的json:

{ "ImpiantiProva": [
        {
        "nomeImpianto":"MFL1",
        "descrImpianto":"Multifilo 1",
        "posizione":"Place1",
        "dati_status": "true",
        "unita_misura": "m/s",
        "vel_attuale": 11.5,

        "vel": [24.5,13.6,34.6,12.1],
        "orario": ["17.05","17.06","17.07","17.08"]
        },  

        {
        "nomeImpianto":"MFL2",
        "descrImpianto":"Multifilo 2",
        "posizione":"Place2",
        "dati_status": "true",
        "unita_misura": "m/s",
        "vel_attuale": 12.5,

        "vel": [24.5,13.6,34.6,12.1],
        "orario": ["17.05","17.06","17.07","17.08"]
        }
    ]
}

在data.service.ts中,我有http请求,它将值存储在:

stream$: Observable<ImpiantoModel[]>;

这里是我对模型的定义:

#impianto.model
export class ImpiantoModel {
  nomeImpianto: string;
  descrImpianto: string;
  posizione: string;
  dati_status: string;
  unita_misura: string;
  vel_attuale: number;
  vel: VelocitaModel[];
  orario: OrariModel[];
}


 #orari.model.ts
export class OrariModel {
  orario: string;
}


  #velocita.model.ts
export class VelocitaModel{
  vel : number;
}

为什么定义我的对象是正确的?

如何使用数组"vel""orario"

如何使用"vel"打印(访问)计算机的数组"nomeImpianto" = "MFL1"

如何在新阵列上复制数组"vel"

非常感谢你!

3 个答案:

答案 0 :(得分:1)

我不确定我理解你,但我会尝试。

  

为什么定义我的对象是正确的?

应该是:

export class ImpiantoModel {
  nomeImpianto: string;
  descrImpianto: string;
  posizione: string;
  dati_status: string;
  unita_misura: string;
  vel_attuale: number;
  vel: Array<string>;
  orario: Array<string>;
}

(但我必须承认,我不知道为什么模型而不是界面)

  

如何使用数组“vel”和“orario”?

你是什么意思?

  

如何打印(访问)机器的数组“vel”   “nomeImpianto”=“MFL1”

const thisContainsTheDataFromVel = whereYourDataIsStored['ImpiantiProva'].find((item) => { item['nomeImpianto'] === 'MFL1'})['vel'];
  

如何在新阵列上复制数组“vel”?

在此答案下阅读您的评论后更新:

我从您的示例中获取了代码并添加了您缺少的内容。我做到了它可以更加可重用(它可以进一步增强,但我希望你理解代码并做你需要的。)

copyArray(data, targetValue) {
  const mfl1Data = data.find((item) => item['nomeImpianto'] === targetValue);

  if (mfl1Data) {
    return mfl1Data.vel;
  }

  return [];
}

getdata2() {
    this.http.get<ImpiantoModel[]>(this.myUrl)
      .subscribe(
        data => {
          this.variableToStoreIn = this.copyArray(data, 'MFL1');
          data.forEach(item => {
            this.sub$.next(item);
          });
        });

    return this.sub$;
  }

CopyArray查找数据并将其返回。如果您不希望这样,但只需将某个属性的值设置为vel数组的值,那么您可以将其更改为:

copyArray(data) {
      const mfl1Data = data.find((item) => item['nomeImpianto'] === targetValue);

      if (mfl1Data) {
        this.yourVariable = mfl1Data.vel;
      }
    }

如果这个答案足够,请考虑将其标记为最佳答案,谢谢。

答案 1 :(得分:1)

以下是我对你想要做的事情的理解:在你的json resp中获取项目并将它放在你的对象中,所以最好的方法是在你得到json响应时直接创建一个静态方法,然后再返回value创建此适配器adaptImpiant(jsonObj),它将执行以下操作:

adaptImpiant(jsonObj) {
    let impiantTab = [];
    jsonObj.ImpiantiProva.forEach((item) => {
      let impiantoModel = {};
      // impiantoModel = item if the model (below) match the item;
      // if not manually set all your var like your velocita
      let velocita =  [] // is an array or an object with an array
      // if class velocita = {} 
      velocita = item.vel.slice(0); 
      // if class velocita.valuesTab = item.vel.slice(0);
      impiantoModel.velocita = velocita;
      impiantTab.push(impiantoModel);
    }    
}

在这种情况下你的模型似乎不对,因为你已经使用了ImpiantoModel数组,所以只需创建一个你想要的类:

#impianto.model
export class ImpiantoModel {
   nomeImpianto: string;
   descrImpianto: string;
   posizione: string;
   dati_status: string;
   unita_misura: string;
   vel_attuale: number;
   vel: VelocitaModel // or simply [];
   orario: OrariModel // or simply [];
}

答案 2 :(得分:0)

根据您的模型类,您的JSON是错误的。你应该有这样的东西:

{ "ImpiantiProva": [
        {
        "nomeImpianto":"MFL1",
        "descrImpianto":"Multifilo 1",
        "posizione":"Place1",
        "dati_status": "true",
        "unita_misura": "m/s",
        "vel_attuale": 11.5,

        "vel": [
            {
                "vel": 24.5 
            },
             {
                "vel": 13.6
            }
            ...
        ],
        "orario": [
            {
                "orario": "17.05"   
            },
             {
                "orario": "17.06"
            }
            ...
        ]
        }
    ]
}

您的模型希望ImpiantoModel.velImpiantoModel.orario成为对象数组。在您的JSON响应中,一个是数字数组,另一个是字符串。

如果您想在HTML模板中使用它,请考虑您的.ts文件中有类属性,如下所示:

private impiantoModels: ImpiantoModel[];

您可以在.html模板中执行以下操作:

<div *ngFor="let impModel of impiantoModels">
    ...
    <div *ngFor="let v of impModel.vel">
        <p>{{v.vel}}</p>
    </div>

    <div *ngFor="let o of impModel.orario">
        <p>{{o.orario}}</p>
    </div>
</div>