use*_*491 19 javascript json object
假设我有json数据
data = {"id":1,
"name":"abc",
"address": {"streetName":"cde",
"streetId":2
}
}
Run Code Online (Sandbox Code Playgroud)
现在我从这个json数据中获取字段,如: fields = ["id", "name", "address.streetName"]
我怎样才能address.streetName以最有效的方式从给定的json数据中访问第三个field()?
data.fields[2]不起作用
一种可能性是我data[address][streetName]使用for循环构造字符串并对其进行评估,但有没有有效的方法呢?
Chr*_*ian 35
说实话,我无法理解你的问题.JSON已经结构化了,为什么需要更改结构?
在你的情况下,我会按如下方式访问它:
data.address.streetName;
Run Code Online (Sandbox Code Playgroud)
如果您想要的是通过任何机会遍历数据,您将需要:
function traverse_it(obj){
for(var prop in obj){
if(typeof obj[prop]=='object'){
// object
traverse_it(obj[prop[i]]);
}else{
// something else
alert('The value of '+prop+' is '+obj[prop]+'.');
}
}
}
traverse_it(data);
Run Code Online (Sandbox Code Playgroud)
更新
阅读下面的内容,这个用户需要的东西似乎更加明显.将属性名称作为字符串,他/她想要访问该对象.
function findProp(obj, prop, defval){
if (typeof defval == 'undefined') defval = null;
prop = prop.split('.');
for (var i = 0; i < prop.length; i++) {
if(typeof obj[prop[i]] == 'undefined')
return defval;
obj = obj[prop[i]];
}
return obj;
}
var data = {"id":1,"name":"abc","address":{"streetName":"cde","streetId":2}};
var props = 'address.streetName';
alert('The value of ' + props + ' is ' + findProp(data, props));
Run Code Online (Sandbox Code Playgroud)
Bri*_*ark 15
如果你使用lodash(一个非常流行的实用程序库),你可以使用_.get().
例如
var data = {
"id":1,
"name": "abc",
"address": {
"streetName": "cde",
"streetId":2
}
}
_.get(data, 'address.streetName');
// 'cde'
_.get(data, ['address', 'streetName']);
// 'cde'
Run Code Online (Sandbox Code Playgroud)
如果它涉及一个数组,你也可以使用字符串路径'address[0].streetName'.
例如
var data = {
"id":1,
"name": "abc",
"addresses": [
{
"streetName": "cde",
"streetId": 2
},
{
"streetName": "xyz",
"streetId": 102
},
]
}
_.get(data, 'addresses[0].streetName');
// cde
_.get(data, [address, 1, streetName]);
// xyz
Run Code Online (Sandbox Code Playgroud)
在内部,它使用toPath()函数将字符串路径(例如address.streetName)转换为数组(例如['address', 'streetName']),然后使用函数访问对象内给定路径的数据.
其他类似的实用功能包括_.set()和_.has().去看一下.
Sal*_*n A 10
长话短说,你可以使用数组符号object[property]代替object.property; 当键包含特殊字符时,这特别有用:
var data = {
"id": 1,
"name": "abc",
"address": {
"streetName": "cde",
"streetId": 2
}
}
data.address.streetName; // (1) dot notation
data["address"]["streetName"]; // (2) array notation
var field = "streetName";
data["address"][field]; // (3) variable inside array notation
var fields = "address.streetName".split(".");
data[fields[0]][fields[1]]; // (4) specific to your question
Run Code Online (Sandbox Code Playgroud)
在使用之前,您可以使用typeof运算符检查属性是否存在:
typeof data["address"]["streetName"]; // returns "string"
typeof data["address"]["foobarblah"]; // returns "undefined"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
91254 次 |
| 最近记录: |