两个数字不等于但它们具有相同的类型和值

时间:2016-08-26 13:17:02

标签: javascript json angular typescript

我遇到的问题是,两个相同类型的相同值在Typescript / Javascript中不相等。 我想做什么:我从JSON获取数据,我想通过id-attributes将一些数据与此JSON的其他数据连接起来。 id永远不会匹配。

我最后附上了我的文件。 问题在于getStationNameById(): 即使“id”为2而“station.id”为2,它们也不等于。它们甚至不等于“== 2”。我完全不知道问题是什么。由于我的调试输出,两个值都是数字..但结果总是错误。

my component.ts

import {Component, OnInit} from '@angular/core';
import {DataService} from "../../services/data.service";

@Component({
    selector:    'alle-stationen-view',
    templateUrl: './src/html/alle-verbindungen-view.component.html',
    styleUrls: [ './src/css/views-general.css', './src/css/alle-verbindungen-view.component.css']
})
export class AlleVerbindungenViewComponent implements OnInit {
    private connections: any[];
    private stations : any[];

    constructor(private dataService : DataService) {};

    ngOnInit(): void {
        this.dataService.getData().subscribe(
            data => this.dataHandler(data)
        );
    }

    private dataHandler(data) {
        let connections = data.connections || {};
        let stations    = data.stations    || {};
        this.stations = stations;
        connections.forEach(function(connection) {

            // TO DO: DOESNT WORK!
            connection.fromStation = this.getStationNameById(connection.fromStationId);
            connection.toStation   = this.getStationNameById(connection.toStationId);
        }, this);
        this.connections = connections;
    }

    private getStationNameById(id : number) {
        console.debug("---");
        this.stations.forEach(function(station) {
            // both have Constructor "Number"
            console.debug("id.type="+id.constructor+", station.id.type="+station.id.constructor);
            console.debug("id="+id+", station.id="+station.id);
            console.debug("station.id==id : "+station.id == id)+""; // ALWAYS FALSE
            console.debug("station.id===id: "+station.id === id+""); // ALWAYS FALSE
            console.debug("id == 2:" +id==2); // ALWAYS FALSE
            console.debug("station.id == 2:" +station.id==2); // ALWAYS FALSE
            if (station.id === id) {
                return station.name;
            }
        });
        return "";
    }
}

data.json

{
  "data": {
    "stations": [
      {
        "id": 1,
        "name": "Hamburg Mitte"
      },
      {
        "id": 2,
        "name": "Hamburg Ost"
      },
      {
        "id": 3,
        "name": "Hamburg Hauptbahnhof"
      }
    ],
    "connections": [
      {
        "id": 1,
        "fromStationId": 1,
        "toStationId": 2,
        "duration": 7
      },
      {
        "id": 2,
        "fromStationId": 2,
        "toStationId": 1,
        "duration": 7
      },
      {
        "id": 3,
        "fromStationId": 1,
        "toStationId": 3,
        "duration": 2
      },
      {
        "id": 4,
        "fromStationId": 3,
        "toStationId": 1,
        "duration": 2
      },
      {
        "id": 5,
        "fromStationId": 2,
        "toStationId": 3,
        "duration": 10
      },
      {
        "id": 6,
        "fromStationId": 2,
        "toStationId": 2,
        "duration": 10
      }
    ]
  }
}

控制台输出

id.type=function Number() { [native code] }, station.id.type=function Number() { [native code] }
alle-verbindungen-view.component.ts:39 id=1, station.id=1
alle-verbindungen-view.component.ts:40 false
alle-verbindungen-view.component.ts:41 false
alle-verbindungen-view.component.ts:42 false
alle-verbindungen-view.component.ts:43 false
alle-verbindungen-view.component.ts:38 id.type=function Number() { [native code] }, station.id.type=function Number() { [native code] }
alle-verbindungen-view.component.ts:39 id=1, station.id=2
alle-verbindungen-view.component.ts:40 false
alle-verbindungen-view.component.ts:41 false
alle-verbindungen-view.component.ts:42 false
alle-verbindungen-view.component.ts:43 false
alle-verbindungen-view.component.ts:38 id.type=function Number() { [native code] }, station.id.type=function Number() { [native code] }
alle-verbindungen-view.component.ts:39 id=1, station.id=3
alle-verbindungen-view.component.ts:40 false
alle-verbindungen-view.component.ts:41 false
alle-verbindungen-view.component.ts:42 false
alle-verbindungen-view.component.ts:43 false
alle-verbindungen-view.component.ts:35 ---

2 个答案:

答案 0 :(得分:4)

你这样做是错误的。

在您的代码中,您使用console.debug("id == 2:" +id==2);比较“id == 2”== 2表示您将字符串与2进行比较。

例如,试试这个console.debug("id == 2:" +2==2);你会得到错误的,因为你实际上是在比较"id == 2:2" == 2,这总是会给你错误。

如果您需要更多解释,请与我们联系。

编辑: 在此声明中,我们使用两个运算符+==+的优先级高于==。首先+执行==执行。

答案 1 :(得分:0)

我找到了解决方案。由于我错误地调试输出,我在错误的位置搜索了该错误。在我使用括号后,我收到了真实的结果。我认为forEach函数的返回影响了整个方法,而不仅仅是这个块。因此该方法一直返回“”。这现在有效:

let customRedColor = UIColor( red: 255, green: 0, blue: 13, alpha: 1 )
self.navigationController?.navigationBar.barTintColor = customRedColor