亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

安全地訪問Javascript嵌套對象

安全地訪問Javascript嵌套對象

瀟瀟雨雨 2019-10-22 21:37:16
我有基于json的數據結構,其中包含嵌套對象。為了訪問特定的數據元素,我將對對象屬性的引用鏈接在一起。例如:var a = b.c.d;如果未定義b或bc,則將失敗并顯示錯誤。但是,我想獲得一個值,如果它存在,否則就是不確定的。無需檢查鏈中每個值是否存在的最佳方法是什么?我想使這種方法盡可能通用,所以我不必添加大量的輔助方法,例如:var a = b.getD();要么var a = helpers.getDFromB(b);我也想嘗試避免使用try / catch構造,因為這不是錯誤,因此使用try / catch似乎放錯了位置。那合理嗎?有任何想法嗎?
查看完整描述

3 回答

?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

您可以創建一個通用方法,該方法基于屬性名稱數組訪問元素,該屬性名稱數組被解釋為通過屬性的路徑:


function getValue(data, path) {

    var i, len = path.length;

    for (i = 0; typeof data === 'object' && i < len; ++i) {

        data = data[path[i]];

    }

    return data;

}

然后,您可以使用以下命令調用它:


var a = getValue(b, ["c", "d"]);


查看完整回答
反對 回復 2019-10-22
?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

標準方法:


var a = b && b.c && b.c.d && b.c.d.e;

速度非???,但不太優雅(尤其是具有較長的屬性名稱)。


使用函數遍歷JavaScipt對象屬性既不高效也不優雅。


嘗試以下方法:


try { var a = b.c.d.e; } catch(e){}

如果您確定a以前沒有使用過,或者


try { var a = b.c.d.e; } catch(e){ a = undefined; }

如果您之前已經分配過。


這可能比第一種選擇更快。


查看完整回答
反對 回復 2019-10-22
?
DIEA

TA貢獻1820條經驗 獲得超2個贊

獲取的價值path的object。如果解析的值為undefined,defaultValue則返回。


在ES6中,我們可以從Object下面的類似代碼片段中獲取嵌套屬性。


const myObject = {

    a: {

      b: {

        c: {

          d: 'test'

        }

      }

    },

    c: {

      d: 'Test 2'

    }

  },


  isObject = obj => obj && typeof obj === 'object',


  hasKey = (obj, key) => key in obj;




function nestedObj(obj, property, callback) {

  return property.split('.').reduce((item, key) => {

    if (isObject(item) && hasKey(item, key)) {

      return item[key];

    }

    return typeof callback != undefined ? callback : undefined;

  }, obj);

}


console.log(nestedObj(myObject, 'a.b.c.d')); //return test



console.log(nestedObj(myObject, 'a.b.c.d.e')); //return undefined



console.log(nestedObj(myObject, 'c.d')); //return Test 2



console.log(nestedObj(myObject, 'd.d', false)); //return false



console.log(nestedObj(myObject, 'a.b')); //return {"c": {"d": "test"}}


查看完整回答
反對 回復 2019-10-22
  • 3 回答
  • 0 關注
  • 809 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號