【问题标题】:Angular 2+ - Parse JSON as numberAngular 2+ - 将 JSON 解析为数字
【发布时间】:2018-10-13 17:20:31
【问题描述】:

我想使用 Angular Google Maps 在 Google 地图上放置一个标记,我的坐标来自 JSON 文件,在 Angular 中解析时它变成了一个字符串。

Angular 谷歌地图不支持坐标数字的字符串。所以它需要是数字。

ma​​rker.json

[  
   {  
      "id":"1",
      "lat":"13.751814",
      "lon":"100.501060"
   },
   {  
      "id":"2",
      "lat":"13.738445",
      "lon":"100.516805"
   },
   {  
      "id":"3",
      "lat":"13.730209",
      "lon":"100.779991"
   }
]

ma​​ps.componenet.ts

import { Component, OnInit } from '@angular/core';
import {Http, Response} from '@angular/http';

@Component({
  selector: 'app-maps',
  templateUrl: './maps.component.html',
  styleUrls: ['./maps.component.css']
})
export class MapsComponent implements OnInit {

    private data;

    constructor(private http:Http){
    }

    ngOnInit(){
      this.getData();
    }

    getData(){
        this.http.get('/localhost/marker.json')
            .subscribe(res => this.data = res.json());
    }

}

ma​​ps.component.html

<agm-map [latitude]="13.359665" [longitude]="101.035913" [zoom]="6">
    <ng-container *ngFor="let list of data">
        <agm-marker [latitude]="list.lat" [longitude]="list.lon"></agm-marker>
    </ng-container>
</agm-map>

我尝试过像这样使用 parseFloat(是的,它不起作用)

<agm-marker [latitude]="parseFloat(list.lat)" [longitude]="parseFloat(list.lon)"></agm-marker>

我正在考虑在 maps.component.ts 文件中使用 parseInt,但我不确定该放在哪里。

请有人帮助我或指导我如何解决这个问题。请让我知道我是否提供了足够的信息。

谢谢!

【问题讨论】:

  • 需要手动转换,这是JSON.parse()的默认行为
  • 你可以试试[latitude]="+list.lat"
  • 为什么parseFloat 不起作用?错误?
  • @ConnorsFan 谢谢,但它不起作用。
  • @Jeff 它说parseFloat is not a function(完整的错误日志pastebin.com/8RNSVZ7P

标签: json angular typescript


【解决方案1】:

Angular 模板中不允许使用像 parseFloat 这样的全局函数(请参阅 the Angular documentation)。

您可以使用+ 运算符将字符串转换为数字:

<agm-marker [latitude]="+list.lat" [longitude]="+list.lon"></agm-marker>

或者在你的组件中定义一个方法:

convertCoordinate(str: string): number {
  return parseFloat(str);
}

并在模板中调用它:

<agm-marker [latitude]="convertCoordinate(list.lat)" [longitude]="convertCoordinate(list.lon)"></agm-marker>

【讨论】:

  • 您可以将数据记录到控制台(在 http 回调中)以查看字符串的样子。或者您可以在模板中使用插值(例如{{list.lat}})显示它们。
  • 顺便说一句,您在问题中显示的标记中的&lt;agm-marker&gt; 开始标记缺少结束&gt;
  • 在标记中添加带有硬编码坐标的标记是否有效?您还可以更改(或删除)缩放,看看它是否允许看到标记。
  • 它可以与&lt;agm-marker [latitude]="'13.359665'" [longitude]="'101.035913'"&gt;&lt;/agm-marker&gt; 一起使用吗?只是为了确保传递字符串真的不起作用。
  • 还有一件事要尝试:测试一个硬编码标记,该标记与列表中的一项具有完全相同的值(如 pastebin 中所示)。您尝试的硬编码值有些不同,尤其是经度。
【解决方案2】:

一种更简洁、更高效的方式是一次性处理数据并以不需要任何其他准备的方式将其提供给视图:

getData(){
    this.http.get('/localhost/marker.json')
    .map(res => res.json())
    .map((data: any[]) => data.map(
      ({ lon, lat, ...props }) => ({ lon: +lon, lat: +lat, ...props })
    ))
    .subscribe(data => {
      this.data = data;
    });
}

如果marker.json除了列出的props之外没有其他props,...props可以替换为已知的id属性。

【讨论】:

  • 谢谢,但我收到了这个错误Failed to compile. &lt;my-project-path&gt;/maps.component.ts (54,10): Property 'map' does not exist on type 'Observable&lt;Response&gt;'.
  • 添加仍然有错误(我的IDE中的错误i.imgur.com/wR4CIjN.png
  • 那你没有导入操作符。您使用的任何可观察运算符都应该被导入,例如import 'rxjs/add/operator/map'。见stackoverflow.com/questions/45483934/…
  • 我希望它能按预期工作,plnkr.co/edit/XDsezGYihmpolaMHPSAg?p=preview。如果您在调试问题时遇到问题,请考虑提供一种方法来复制问题 - Stackblitz、Plunker 等。
  • 当然。如果当前问题与最初提出的问题确实不同,请考虑更新问题或发布新问题。
【解决方案3】:

+lat 在 Angular 模板中不起作用,它是无效的语法并且会抛出错误,以及 parseFloat 或 parseInt,在这里您可以像 @estus 指出的那样解析请求中的 JSON 或者您可以将字符串相乘1:

&lt;agm-marker [latitude]="list.lat * 1" [longitude]="list.lon * 1"&gt;&lt;/agm-marker&gt;

这会将字符串转换为数字,但请注意,如果它不是数字,则会出现错误并且您将无法捕获它。

【讨论】:

  • 这将是一个不错的 hack,但不,+lat 是有效的语法。
  • 在 HTML 模板上?
  • 为什么lat * 1 有效但+lat 无效?
  • 是的,+lat 也是 Angular 解析器识别的有效 JS 语法,plnkr.co/edit/WWn8mkCY9IqZfVMYsr00?p=preview
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2016-07-27
  • 1970-01-01
  • 2017-11-30
  • 2017-10-25
  • 1970-01-01
  • 2019-10-28
相关资源
最近更新 更多