簡體   English   中英

如何使用字符串訪問對象的嵌套屬性?

[英]How to access a nested property of an object using a string?

我有以下字符串:

const str = "prop1.prop2.prop3"

我想使用這個字符串來訪問以下對象的屬性 prop3:

const obj = {
   prop1: {
      prop2:{
         prop3:{
            // ---- destination point
         }
      }
   }
}

但我不知道該怎么做? 必須有一些東西不斷添加obj[currentProp]等等。 而且..沒有更快的方法嗎? 恐怕我把時間浪費在更容易實現的事情上

這將是我的方法:

const access = (path, object) => {
  return path.split('.').reduce((o, i) => o[i], object)
}

const obj = {
  prop1: {
    prop2: {
      prop3: {
        value: 'foo'
      }
    }
  }
}

const str = 'prop1.prop2.prop3'

console.log(access(str, obj)) // {"value": "foo"}

訪問對象的嵌套屬性的不同方法

使用帶有兩個參數的函數accessDeepProp嵌套屬性的對象和路徑!

遞歸方式:

function accessDeepProp(obj, path) {
  if (!path) return obj;
  const properties = path.split(".");
  return accessDeepProp(obj[properties.shift()], properties.join("."));
}

For循環方式:

function accessDeepProp(obj, path) {
  const properties = path.split(".");
  for (let i = 0; i < properties.length; i++) {
    if (!obj) return null;
    obj = obj[properties[i]];
  }
  return obj;
}

評估方式: never_use_eval!

function accessDeepProp(objName, path) {
  try {
    return eval(`${objName}.${path}`);
  } catch (e) {
    return null;
  }
}

你也可以使用lodash get 方法

您可以將splitforEach組合如下:

 const str = "prop1.prop2.prop3" const obj = { prop1: { prop2:{ prop3:{ a: "b", c: "d" } } } } var srch = obj; str.split(".").forEach(item => (srch = srch[item])); console.log(srch); // { a: "b", c: "d"} console.log(obj);

splitstr的值轉換為一個數組,然后循環該數組,並且在每次迭代中, srch會更深一層。

這是最短的解決方案,它支持數組和 ['bracket notation']。 只是不要針對惡意用戶輸入運行它。

更新:沒有eval的更好(?)版本。

 const obj = { prop1: { prop2: { prop3: { value: 'foo' } } } } const str = 'prop1.prop2.prop3' //console.log(eval("obj." + str)) // a code without eval var value = (Function("return obj." + str))(); console.log(value);

暫無
暫無

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

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