如何从javascript对象获取属性值

时间:2016-05-29 13:45:17

标签: javascript jquery arrays javascript-events javascript-objects

我有一个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

4 个答案:

答案 0 :(得分:8)

使用 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

答案 1 :(得分:2)

使用以下功能:

with open(sys.argv[1], 'b') as _f:
    for i, line_bytes in enumerate(_f):
        try:
            line = line_bytes.decode('utf-16')
            # do some stuff with line ...
        except UnicodeDecodeError:
            pass

答案 2 :(得分: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;
  }
}

答案 3 :(得分: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]];
};

它将采用嵌套属性的动态参数。如果它们是字符串类型,则它们是对象属性(如果是数字类型)则它们是数组索引一旦你有了这个,你的工作变得非常容易。我们来看看..

&#13;
&#13;
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);
&#13;
&#13;
&#13;

您可以在https://stackoverflow.com/a/37331868/4543207

看到getNestedValue()及其setNestedValue()双胞胎private void UpdateCheckedListBox() // You would need to add your parameters { checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck; // your changes to checked list box goes here checkedListBox1.ItemCheck += checkedListBox1_ItemCheck; }