【问题标题】:Get only one element from array of objects in JSON从 JSON 中的对象数组中仅获取一个元素
【发布时间】:2016-04-01 06:33:51
【问题描述】:

我怎样才能只从 JSON 文件中获取名称。代码也非常适合从“file.json”获取数据,也就是说,这肯定不是问题。

JavaScript:

var data = [];
function getName() {
  //what should I write here to get only name from the first object i.e. John
  //with this: data[0].name I am getting error!
}

var xhttp;
if(window.XMLHttpRequest)
  xhttp = new XMLHttpRequest();
else
  xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    
xhttp.onreadystatechange = function() {
  if(xhttp.readyState == 4) {
    data = JSON.parse(xhttp.responseText);
    getName();
  }
}

xhttp.open("GET","file.json",true);
xhttp.send();

“file.json” - JSON:

[
  {
    "name":"John",
    "city":"London"
  },
  {
    "name":"Maria",
    "city":"Rome"
  }
]

【问题讨论】:

  • (你可以用onload代替onreadystatechangereadyState。)
  • 对我来说工作正常,没有错误。你的错误是什么? jsfiddle.net/rudiedirkx/0xf62ny6 记录整个数据对象,然后data[0].name
  • 错误是什么?为什么要使用全局变量而不是将值传递给函数?
  • 是的,是的,终于成功了,我有其他代码行出错了,现在 data[0].name 正在工作!
  • @FelixKling 因为这是我在学校学习的方式。

标签: javascript arrays json object


【解决方案1】:

值得一提的是,JSON 数据类型直接映射到标准 javascript 数据类型。这意味着没有 JSON 数组之类的东西,一旦你 JSON.parse() 一个字符串,你就会得到纯 JavaScript 原语:数组、对象、字符串、数字等。

因此,从 JSON 数组中获取元素只是访问标准 javascript 数组中的元素。这通常通过方括号运算符var element = array[index] 来实现。

但是,您的代码在与数组元素访问无关的几个部分中被破坏了。

首先,您在顶层定义 data 变量 - 您只是不需要它(至少根据示例)。

然后,你用一个空数组初始化它——我不知道为什么。

您的onreadystatechange 回调在用文字表示时很简单:您得到一个字符串,将其解析为json,然后调用getName 提供结果。这意味着您的 getName() 应该需要一个 data 参数,然后您可以在函数中访问该参数。

【讨论】:

    【解决方案2】:

    通过函数传递变量数据

    var data = [];
    function getName(data) {
      return data[0].name;
    }
    
    var xhttp;
    if(window.XMLHttpRequest)
      xhttp = new XMLHttpRequest();
    else
      xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    
    xhttp.onreadystatechange = function() {
      if(xhttp.readyState == 4) {
        data = JSON.parse(xhttp.responseText);
        getName(data);
      }
    }
    
    xhttp.open("GET","file.json",true);
    xhttp.send();
    

    另外,如果你想检索所有的名字,你可以这样做:

    function getName(data) {
      var names = [];
      for (var i = 0; i < data.length; i++) {
          names.push(data[i].name);
      }
      return names;
    }
    

    (数据为数组数据)

    【讨论】:

    • 它只给出索引的名字
    • 当然可以,但这不是您想要的吗?或者你想返回一个名称数组?
    • 我认为这个问题的作者希望在 json 文件中获取所有名称,而不是只获取单个名称
    【解决方案3】:

    您的getName 函数应如下所示:

    function getName(){
      a.forEach(function(i,j){
         console.log(i.name);
      });
    }
    

    【讨论】:

      【解决方案4】:

      使用Array.prototype.map() 转换数组中的项目:

      data.map(function(item) {
          return item.name
      });
      

      【讨论】:

      • 这是jQuery函数吗?
      猜你喜欢
      • 2022-01-19
      • 1970-01-01
      • 2017-04-18
      • 2017-08-27
      • 2018-11-23
      • 2014-10-17
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多