3

我有一個JavaScript對象。如何從javascript對象獲取屬性值

var obj = { Id: "100", Name: "John", Address: {Id:1,Name:"Bangalore"} } 
var dataToRetrieve= "Name"; 

function GetPropertyValue(object,dataToRetrieve){ 
     return obj[dataToRetrieve] 
} 
var retval = GetPropertyValue(obj,dataToRetrieve) 

這工作正常。但是,如果我嘗試獲取「Address.Name」屬性值的值,則

例如:var dataToRetrieve = "Address.Name"; 它顯示undefined

說明:屬性變量是由用戶從HTML中設置的,它可以根據用戶需求(他希望的屬性值)進行更改。

我想達到的目標:

1)如果dataToRetrieve = "Name",它應該給我"John"

2)如果dataToRetrieve = "Id",它應該給我"100"

3)如果dataToRetrieve = "Address.Name",它應該給我"Bangalore",

4)如果dataToRetrieve = "Address.Id",它應該給我1

Plunkr這裏:PLUNKR

+1

時,您也可能有興趣在lodash的'GET'方法。 https://lodash.com/docs#get – LukeP

回答

7

使用reduce()方法

var obj = { 
 
    Id: "100", 
 
    Name: "John", 
 
    Address: { 
 
    Id: 1, 
 
    Name: "Bangalore" 
 
    } 
 
} 
 

 
function GetPropertyValue(obj1, dataToRetrieve) { 
 
    return dataToRetrieve 
 
    .split('.') // split string based on `.` 
 
    .reduce(function(o, k) { 
 
     return o && o[k]; // get inner property if `o` is defined else get `o` and return 
 
    }, obj1) // set initial value as object 
 
} 
 

 

 
console.log(
 
    GetPropertyValue(obj, "Name"), 
 
    GetPropertyValue(obj, "Id"), 
 
    GetPropertyValue(obj, "Address.Name"), 
 
    GetPropertyValue(obj, "Address.Id"), 
 
    GetPropertyValue(obj, "Address.Idsd"), 
 
    GetPropertyValue(obj, "Addre.Idsd") 
 
)


對於舊的瀏覽器檢查 polyfill option of reduce method

+2

在上面的答案中加入針對「未定義」值的保護是個好主意。 – renatoargh

+1

@renatoargh:更新了 –

+0

它運作良好。 1問題:如果obj包含一些數組屬性,它會工作嗎?像var obj = {Id:「100」,Name:「John」,Address:[{Id:1,Address:「Bangalore」},{Id:2,Address:「Mysore」}]}然後調用函數像GetPropertyValue(obj,「Address [0] .Name」)? –

2

使用以下功能:

var obj = { Id: "100", Name: "John", 
 
      Address: [{ Id:1, Name:"Bangalore" }, { Id:2, Name: "Mysore" } ] }; 
 

 
function GetPropertyValue(object, dataToRetrieve) { 
 
    dataToRetrieve.split('.').forEach(function(token) { 
 
     if (object) object = object[token]; 
 
    }); 
 
    
 
    return object; 
 
} 
 

 
console.log(
 
    GetPropertyValue(obj, "Address.0.Name"), 
 
    GetPropertyValue(obj, "Address.1.Id"), 
 
    GetPropertyValue(obj, "Name"), 
 
    GetPropertyValue(obj, "Id"), 
 
    GetPropertyValue(obj, "Unknown"), 
 
    GetPropertyValue(obj, "Some.Unknown.Property") 
 
);

2
function GetPropertyValue(object,dataToRetrieve){ 
    var valueArray = dataToRetrieve.split("."); 
    if (valueArray.length <= 1) { 
    return object[valueArray]; 
    } else { 
    var res; 
    function browseObj(obj, valueArray, i) { 
     if (i == valueArray.length) 
     res = obj; 
     else 
     browseObj(obj[valueArray[i]], valueArray, i+1); 
    } 
    browseObj(object, valueArray, 0); 
    return res; 
    } 
} 
2

我寫了一個標準的可重用的Object方法來動態地訪問嵌套屬性。這就像

Object.prototype.getNestedValue = function(...a) { 
    return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]]; 
}; 

它會採取嵌套屬性的動態參數。如果它們是字符串類型,則它們是對象屬性,如果是數字類型,則它們是數組索引一旦你有了這個,你的工作變得非常簡單。讓我們來看看..

Object.prototype.getNestedValue = function(...a) { 
 
    return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]]; 
 
}; 
 
var props = ["Address","Name"], 
 
     obj = { Id: "100", Name: "John", Address: {Id:1,Name:"Bangalore"} }, 
 
     val = obj.getNestedValue(...props); 
 
console.log(val); 
 
// or you can of course do statically like 
 
     val = obj.getNestedValue("Address","Name"); 
 
console.log(val);

你可以看到getNestedValue()和它的孿生setNestedValue()https://stackoverflow.com/a/37331868/4543207