簡體   English   中英

ES5 JavaScript:在嵌套對象中查找特定屬性並返回其值

[英]ES5 JavaScript: Find specific property in nested objects and return its value

我需要使用 ES5 語法返回嵌套對象的特定屬性的值。 每個對象都可以有自己的結構,因此所需的屬性可以位於不同的級別/位置。 例如 -> 我有三個不同的對象,需要屬性“source”的值:

  • first_data 在 list.details.source 中具有該屬性
  • second_data 在 list.details.products[0]._new.source 中具有該屬性
  • third_data 沒有這個屬性,因此它應該返回 false

那么,如何考慮返回特定屬性的值,它可以位於對象中的任何位置?

var first_data = {
    area: "South",
    code: "S265",
    info: {
        category: "enhanced",
        label: "AB | 27AS53",
        variable: "VR"
    },
    list: {
        area: "Mid",
        details: [
            {
                source: "Spain",
                totals: 12,
                products: [
                    {
                        name: "ABC",
                        brand: "Nobrand",
                        id: "111",
                        category: "Men",
                    }
                ]
            }
        ]
    },
    time: 1654775446138
};

var second_data = {
    area: "South",
    code: "S265",
    info: {
        category: "enhanced",
        label: "AB | 27AS53",
        variable: "VR"
    },
    list: {
        area: "Mid",
        details: [
            {
                products: [
                    {
                        name: "ABC",
                        brand: "Nobrand",
                        id: "111",
                        category: "Men",
                        _new: {
                            source: "Spain",
                            totals: 12
                        }
                    }
                ]
            }
        ]
    },
    time: 1654775446138
};

var third_data = {
    area: "South",
    code: "S265",
    info: {
        category: "enhanced",
        label: "AB | 27AS53",
        variable: "VR"
    },
    list: {
        area: "Mid",
        details: [
            {
                products: [
                    {
                        name: "ABC",
                        brand: "Nobrand",
                        id: "111",
                        category: "Men"
                    }
                ]
            }
        ]
    },
    time: 1654775446138
};

我首先嘗試用 ES6 解決它,以便我可以在第二步將其重寫為 ES5。 這是我到目前為止所擁有的。 第一個問題是,我在這里得到一個錯誤,但該屬性存在。

var propertyExists = function (obj, key) {

  if(obj === null || obj === undefined) {
    return false;
  }
  
  for(const k of Object.keys(obj)) {
    if(k === key) {
      return obj[k]
    }
    else {
      const val = obj[k];
      
       if(typeof val === 'object') {
      
        if(propertyExists(val, key) === true) {
          return true;
        }
      }
    }
  }
  
  return false;
}

propertyExists(first_data, 'source')

您的propertyExists函數不起作用,因為它返回了source的值,但它后來檢查了該值是否等於true (如 Felix Kling 在上面的評論中所述)。

這是我的實現(最初在 ES6 中,但我使用了目標設置為 ES5 的打字稿編譯器):

var findProp = function (obj, prop) {
    if (typeof obj != "object") {
        return false;
    }
    if (obj.hasOwnProperty(prop)) {
        return obj[prop];
    }
    for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
        var p = _a[_i];
        if (typeof obj[p] === "object") {
            var t = findProp(obj[p], prop);
            if (t) {
                return t;
            }
        }
    }
    return false;
};

注意:檢測它是哪個對象結構並檢索值可能會更快,因為這樣您就會知道它在哪里。

暫無
暫無

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

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