假设我有像
这样的json数据data = {"id":1,
"name":"abc",
"address": {"streetName":"cde",
"streetId":2
}
}
现在我要从这个json数据中获取字段,例如:fields = ["id", "name", "address.streetName"]
如何以最有效的方式从给定的json数据访问第三个字段(address.streetName
)?
data.fields[2]
不起作用
一种可能性是我使用for循环构造data[address][streetName]
字符串并对其进行评估,但有没有有效的方法呢?
答案 0 :(得分:33)
说实话,我无法理解你的问题。 JSON已经结构化,为什么需要更改结构?
在你的情况下,我会按如下方式访问它:
data.address.streetName;
如果您想要的是遍历数据,那么您需要:
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);
<强>更新强>
阅读下面的内容后,这个用户需要的内容似乎更加明显。将属性名称作为字符串,他/她想要访问该对象。
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));
答案 1 :(得分:14)
如果您使用lodash(非常受欢迎的实用程序库),则可以使用_.get()
。
e.g。
var data = {
"id":1,
"name": "abc",
"address": {
"streetName": "cde",
"streetId":2
}
}
_.get(data, 'address.streetName');
// 'cde'
_.get(data, ['address', 'streetName']);
// 'cde'
如果涉及数组,您也可以使用'address[0].streetName'
之类的字符串路径。
e.g。
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
在内部,它使用toPath()
函数将字符串路径(例如address.streetName
)转换为数组(例如['address', 'streetName']
),然后使用函数访问给定路径中的数据在对象内。
其他类似的效用函数包括_.set()
和_.has()
。检查一下。
答案 2 :(得分:8)
长话短说,您可以使用数组符号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
您可以使用typeof
运算符在使用之前检查属性是否存在:
typeof data["address"]["streetName"]; // returns "string"
typeof data["address"]["foobarblah"]; // returns "undefined"
答案 3 :(得分:2)
您的data
变量没有fields
属性,这就是为什么data.fields[2]
不起作用的原因。我认为你在那里尝试做的是data[fields[2]]
,它适用于一个简单的对象,但你不能索引到这样的复杂对象。
答案 4 :(得分:2)
您可以通过data.address.streetName
答案 5 :(得分:1)
<强> JavaScript的:强>
function getProperty(json, path) {
var tokens = path.split(".");
var obj = json;
for (var i = 0; i < tokens.length; i++) {
obj = obj[tokens[i]];
}
return obj;
}
var data = {
id: 1,
name: "abc",
address: {
streetName: "cde",
streetId: 2
}
};
var fields = ["id", "name", "address.streetName"];
for (var i = 0; i < fields.length; i++) {
var value = getProperty(data, fields[i]);
console.log(fields[i] + "=" + value);
}
<强>输出:强>
id=1
name=abc
address.streetName=cde
答案 6 :(得分:0)
这是我用来在嵌套对象中查找数据的功能:
Object.prototype.find = function() {
try {
return Array.prototype.slice.call(arguments).reduce(function(acc, key) {
return acc[key]
}, this)
}
catch(e) {
return
}
}
数据结构:
data = {
"id":1,
"name":"abc",
"address": {
"streetName":"cde",
"streetId":2
}
}
函数调用:
data.find("address","streetName")
返回:
"cde"
答案 7 :(得分:0)
我是这样做的:
var data = {
"id": 1,
"name": "abc",
"addresses": [{
"streetName": "cde",
"streetId": 2
}, {
"streetName": "xyz",
"streetId": 102
}, ]
}
data2 = data["addresses"]
for (let i in data2) {
console.log(data2[i]["streetName"]);
}