簡體   English   中英

如何遍歷JSON數組並獲取特定值

[英]How to loop through JSON array and get specific values

如何遍歷下面的數組並獲取“ car1”的值? 下面的代碼返回未定義

<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>

要將這些值聚合到數組中,例如:

  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) 

如果內部還有其他對象,並且還希望訪問它們的屬性,則可以創建嵌套循環,如下所示:

 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]對象屬性。

在您的循環中:

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);
 }
}

您的car1屬性不在您嘗試訪問的級別。 循環遍歷對象,並檢查下一級是否存在car1。 如果是這樣,請顯示警報。 還要注意,在for in循環中應該有一個if語句,以確保該屬性存在(或其他一些條件)

 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); } } } 

<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;

您應該將for循環更改為

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

試試看

您在這里有點擔心。 您沒有遍歷數組,而是通過for...in循環遍歷了Object的屬性。

您應該注意這一點。 您可能希望通過更改為更新的遍歷方法來使其“安全”(不會遍歷原型或不可枚舉的屬性)。 即安全地獲取對象的值,而不是鍵的值,然后使用一些較新的循環函數對其進行循環。

由於不需要鍵,我們將使用Object.values獲取值的數組,然后使用Array.prototype.filter()過濾掉Object.prototype.hasownproperty報告的沒有'car1'屬性的Object.prototype.hasownproperty() ,最后對其進行映射,以使用Array.prototype.map()對其進行轉換。 作為保持警報的一種方式,我們將使用Array.prototype.forEach()對每個警報進行警報。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM