如何遍历JSON数组并获取特定值

时间:2018-06-20 21:52:47

标签: javascript arrays json loops

如何遍历下面的数组并获取“ car1”的值?下面的代码返回 undefined

<script>
var myObj = {
  "cars": {
    "car1":"Ford",
    "car2":"BMW",
    "car3":"Fiat"
  },
  "cars2": {
    "car1":"Ford2",
    "car2":"BMW2",
    "car3":"Fiat2"
  }
}

for (x in myObj) {
 alert(x.car1);
}

</script>

7 个答案:

答案 0 :(得分:0)

用于将这些值聚合到数组中,例如:

    let aggregated = [];
    var myObj = {
      "cars": {
        "car1":"Ford",
        "car2":"BMW",
        "car3":"Fiat"
      },
      "cars2": {
        "car1":"Ford2",
        "car2":"BMW2",
        "car3":"Fiat2"
      }
    }

    Object.keys(myObj).forEach(e => {
      aggregated.push(myObj[e].car1)
    })
    
    console.log(aggregated)

答案 1 :(得分:0)

如果内部还有其他对象,并且还希望访问其属性,则可以创建嵌套循环,如下所示:

var myObj = {
  "cars": {
    "car1":"Ford",
    "car2":"BMW",
    "car3":"Fiat"
  },
  "cars2": {
    "car1":"Ford2",
    "car2":"BMW2",
    "car3":"Fiat2"
  }
}

// Iterate over the first level
for (x in myObj) {
  // Iterate over the second level
  for (y in myObj[x]) {
    document.getElementById("demo").innerHTML += myObj[x][y] + "<br>";
  }
}
<div id="demo"></div>

通过这种方式,您也可以遍历myObj[cars]myObj[cars2]对象的属性。

答案 2 :(得分:0)

在您的循环中:

for (x in myObj) {
 alert(x.car1);
}

x是对象键的字符串值。为了获得嵌套对象的car1属性,您可以将循环更改为:

for (x in myObj) {
 alert(myObj[x].car1);
}

在使用for-in循环的同时使用hasOwnProperty也是一种好习惯,它还可能会遍历对象原型链中的属性。

for (x in myObj) {
 if (myObj.hasOwnProperty(x)) {
   alert(myObj[x].car1);
 }
}

答案 3 :(得分:0)

您的car1属性不在您尝试访问的级别。循环遍历对象,并检查下一级是否存在car1。如果是这样,请显示警报。另外请注意,在if循环中应该有一个for in语句,以确保该属性存在(或其他一些条件)

var myObj = {
  "cars": {
    "car1":"Ford",
    "car2":"BMW",
    "car3":"Fiat"
  },
  "cars2": {
    "car1":"Ford2",
    "car2":"BMW2",
    "car3":"Fiat2"
  }
}

for (var x in myObj) {
 if (myObj.hasOwnProperty(x)) {
    var obj = myObj[x];
    if (obj.hasOwnProperty('car1')) {
        alert(obj.car1);
    }

 }
}

答案 4 :(得分:0)

<script>
    var myObj = {
        "cars": {
            "car1": "Ford",
            "car2": "BMW",
            "car3": "Fiat"
        },
        "cars2": {
            "car1": "Ford2",
            "car2": "BMW2",
            "car3": "Fiat2"
        }
    }

    var res = Object.values(myObj)
        .map(i => i.car1)
        .filter(name => (name !== 'Ford2'));

    document.getElementById("demo").innerHTML = res;

答案 5 :(得分:0)

您应该将for循环更改为

for (x in myObj) alert(myObj[x].car1);

尝试一下

答案 6 :(得分:0)

您在这里有点疑虑。您没有遍历数组,而是通过for...in遍历对象的属性。

您应该注意这一点。您可能希望通过更改为更新的遍历方法来使其“安全”(不会遍历原型或不可枚举的属性)。即安全地获取对象的值而不是键的值,然后使用一些较新的循环函数对其进行循环。

由于我们不需要键,因此我们将使用Object.values获取值的数组,然后Array.prototype.filter()过滤掉{{ 3}},最后通过Object.prototype.hasownproperty()对其进行映射以对其进行转换。作为保持警报的一种方式,我们随后将使用Array.prototype.map()

对每个警报进行警报
Object
  .values(myObj) // since we don't care about the keys, only loop over the values
  .filter(obj => // filter out any values without a 'car1' property
    obj.hasOwnProperty('car1') 
  )
  .map(obj => obj.car1) // de-nest the car1 property
  .forEach(alert)

现在,我们有了对象中值的car1属性数组。好消息是,如果也给定对象数组而不是嵌套对象,这将起作用,但这仅是因为我们不在乎保存对象的键,而只是对象实际上具有'car1'属性


为简洁起见

箭头功能

function (a,b){ return console.log(a,b) }

可以改写为

(a,b) => console.log(a,b)

直接功能参考

[1,2,3].forEach(item => alert(item))

可以重写,因为在JavaScript函数中,函数是一阶的,并且可以作为参数传递给其他函数

[1,2,3].forEach(alert)