javascript - 从 api 调用映射时检索嵌套 JSON 对象

标签 javascript json reactjs typescript mapping

我正在努力将 JSON 映射到 React 中的数据驱动渲染。为了完成一些我需要做的事情。我需要嵌套 JSON。 当尝试映射这些数据时,我不断遇到无法映射的值。特别是在尝试 (mapObject.object.value) 时,我尝试将嵌套值传递到插值 div 中。

JSON

{"PositionComponent": [
        {
            "key": 0,
            "Elevation": {
                "positionValue": "1.11566",
                "id": 0
            }
        },
        {
            "key": 1,
            "Azimuth": {
                "positionValue": "1.145657",
                "id": 1
            }
        }
    ]
}

react 组件:

import React, { Component } from 'react';
import '../HeaderBar/HeaderBar.css';
import 'whatwg-fetch';

type StatusBarProps = {};
type StatusBarState = {
    // tslint:disable-next-line:no-any
    positionStatus: any;
};

class StatusBar extends Component<StatusBarProps, StatusBarState> {
    constructor() {
        super();
        this.state = {
            positionStatus: []
        };
    }
    componentWillMount() {
        // maps azimuth and elevation for all objects
        fetch('http://localhost:5001/PositionComponent/').then(results => {
            return results.json();
        }).then(data => {
            let positionStatus = data.map((positioning) => {
                return (
                    <div className="temporary" key={positioning.key}>{positioning.Elevation.positionValue} : {positioning.Azimuth.positionValue}</div>
                );
            });
            this.setState({ positionStatus: positionStatus });
        });
    }
    render() {
        return (
            <div className="location">
                <div className="col-xs-12">
                    {this.state.positionStatus}
                </div>
            </div>
        );
    }
}

export default StatusBar;

相关的 JSON 已针对问题上下文提供,但出于开发速度的考虑,由 JSON.server 提供。问题似乎是我收到 Object {key: 0, Elevation: Object } Object { key: 1, Azimuth: Object } ,我无法通过调用向下进入对象本身{positioning.Elevation.positionValue}。我的问题是,我将如何进行映射,以便获得与仰 Angular 和方位 Angular 相关的内部对象值?

最佳答案

这里的主要问题是,每个包含您想要获取的嵌套键的对象上都有不同的键。
您可以尝试有条件地访问它,并检查是否存在 ElevationAzimuth 并分别访问。
这种方法的缺点是,当您添加新 key 时,应添加另一个条件。所以您可能需要一种更通用的方法。

您可以通过keys使用Object.entries.map并返回每个positionValue。如果某个键不包含它,则将评估 undefined,map 将忽略该键并且不会返回它。
像这样的事情:

Object.entries(positioning).map(([key, value]) => {
  return positioning[key].positionValue;
})

我会将渲染逻辑取出到另一个方法中,并且不会在状态中存储标记。
您想要更改的另一件事是 avoid the use of fetching or side effects in componentWillMount

这是您的代码的运行示例(我没有使用 fetch,因为我的服务器中没有您的数据)

const dataFromServer = [
  {
    key: 0,
    Elevation: {
      positionValue: "1.11566",
      id: 0
    }
  },
  {
    key: 1,
    Azimuth: {
      positionValue: "1.145657",
      id: 1
    }
  }
];

class StatusBar extends React.Component {
  constructor() {
    super();
    this.state = {
      positionStatus: []
    };
  }

  componentDidMount() {
    let positionStatus = dataFromServer;
    this.setState({ positionStatus: positionStatus });
  }

  renderPositionstatus = () => {
    const { positionStatus } = this.state;
    return (
      <div>
        {positionStatus.map(positioning => {
          return (
            <div className="temporary" key={positioning.key}>
              {Object.entries(positioning).map(([key, value]) => {
                return positioning[key].positionValue;
              })}
            </div>
          );
        })}
      </div>
    );
  };

  render() {
    return (
      <div className="location">
        <div className="col-xs-12">{this.renderPositionstatus()}</div>
      </div>
    );
  }
}

ReactDOM.render(<StatusBar />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

关于javascript - 从 api 调用映射时检索嵌套 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47294590/

相关文章:

javascript - 确保两个单独的对象具有唯一的总键集

javascript - 如何在浏览器不崩溃的情况下将大量json数据导出到CSV?

javascript - 映射和推送数组

javascript - 用拆分和反转的逻辑理解回文码

javascript - 如何在 SAILS JS 的 API REST 中使用方法过滤器搜索?

json - 使用decodable进行自定义json解码

javascript - 避免打开文件选择弹出窗口

javascript - 对显示的选择更改选项值使用react

javascript - 将配置文件与angularjs一起使用

javascript - 如何在 Ionic 中使用 AngularJs 在不同页面上显示数组元素