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