当对象名称是动态的时,通过JSON对象解析的有效方法?

时间:2014-04-30 17:20:40

标签: javascript jquery json

这可能吗?如果是这样我将如何实现这一目标?

x将是通过对服务器的ajax调用检索的json对象,并将包含不同的对象名称,具体取决于我需要经历的名称并完成不同的操作。

我想知道我是否可以访问对象键并使用开关或其他方法根据对象名称执行操作,json对象是动态的,因此我认为切换最好覆盖每个场景。< / p>

JSON

x = {
"a": {
    "name": "john",
    "age": "53",
    "more": "foo"
},
"b": {
    "test": "testing",
    "x": "c",
    "z": "b"
},
"c": {
    "foo": "testing",
    "bar": "2",
    "more": "lol"
}
}

示例切换使用上面的json

switch (x)
{
    case 'a':
        var name = a['name']; // should equal john, need the correct way of doing this
        break;

    case 'b':
        var x = b['x']; // would equal c
        break;
}

5 个答案:

答案 0 :(得分:1)

你可以迭代

for (var key in x) {
    switch (key) {
        case 'a': 
            var name = x[key]['name'];
        break;
        case 'b':
            var _x = x[key]['x'];
        break;
    }
}

FIDDLE

或只检查某些属性

for (var key in x) {
    if ('name' in x[key]) var name = x[key]['name'];
    if ('test' in x[key]) var test = x[key]['test'];
}

FIDDLE

答案 1 :(得分:1)

创建另一个对象并命名方法的方式与x对象中的键相同:

var obj = {}
var x = {
"a": {
    "name": "john",
    "age": "53",
    "more": "foo"
},
"b": {
    "test": "testing",
    "x": "c",
    "z": "b"
},
"c": {
    "foo": "testing",
    "bar": "2",
    "more": "lol"
}
}

var methods = {
    "a": function(a) { obj.name = a.name },
    "b": function(b) { obj.y = b.x },
    "c": function(c) { ... }
}


for(var key in x) {
      if (methods.hasOwnProperty(key))
         methods[key](x[key])
}

答案 2 :(得分:0)

这是不可能的 - 至少不是以switch概述的方式。我建议使用标准if条件来测试x对象中是否存在该属性,然后从中检索所需信息。

这样的事情:

if (x["a"]) {
    var name = x["a"]["name"];
    // do something...
}
else if (x["b"]) {
    var y = x["b"]["x"];
    // do something...
}

答案 3 :(得分:0)

我不会在for循环中使用开关。可能的属性名称集似乎有限,定义明确并且为您所知,所以您可以通过它们:

var x = {…};

if ("a" in x) {
    var name = x.a.name;
    // do the "name" action
}
if ("b" in x)
    var _x = x.b.x;
    // do the "x" action
}
…

答案 4 :(得分:0)

试试这个(模式)

var props = function(prop, queryprop) {
var queryprop = new RegExp(/john|c/);
if ( queryprop.test(prop) ) {
  console.log(prop);
};
return !prop
};

x = {
"a": {
    "name": "john",
    "age": "53",
    "more": "foo"
},
"b": {
    "test": "testing",
    "x": "c",
    "z": "b"
},
"c": {
    "foo": "testing",
    "bar": "2",
    "more": "lol"
}
};

$.each(x, function(index, value, _props) { 
  var _props = ["a", "b"];
  if (index === "a") { var name  = value.name; props(name); }; 
  if (index === "b") { var x = value.x; props(x); }; 
  return _props[index] != index;
});