获取json路径获取价值

时间:2015-07-06 22:40:49

标签: javascript json

我有一个json对象:

var config = 
{
    "data1" :
    {
        "emp1":
        {
            "phone" : "111",
            "address": "xxx"
        },
        "emp2":
        {
            "phone" : "111",
            "address": "xxx"
        }
    }   
}

在我的函数中,我传递了根对象和我想要的名字的字符串:

function getEmp(config, section)
{
}

config是上面的json对象。 Section是emp1或emp2的字符串。 我希望能够结合使用像这样的功能

var emp1Data = getEmp(config, 'emp1')

返回JSON对象的那部分的最佳方法是什么?

我试过了:

function getEmp(config, section)
{
  return JSON.parse(config + '.' + emp);
}

但这失败了。我希望能够在没有循环函数的情况下完成它。

更新1 我的配置对象有一个额外的逗号。我已经更新了

更新2 我现在修复了我的配置对象

5 个答案:

答案 0 :(得分:0)

如果你有一个Javascript对象:

var config = {
    "emp1":
    {
        "phone" : "111",
        "address": "xxx"
    },
    "emp2":
    {
        "phone" : "111",
        "address": "xxx"
    }
}

然后您可以这样访问它:

(function(config, section) {
  return config[section];
})(config, 'emp1');

使用[]表示法访问config对象的属性,类似于config.emp1

请参阅以下关于[]属性访问符号的MDN文章:Property Accessors

答案 1 :(得分:0)

您的配置定义不明确。你想要这样的东西:

var config =
{
    "emp1":
    {
        "phone" : "111",
        "address": "xxx"
    },
    "emp2":
    {
        "phone" : "111",
       "address": "xxx"
    }       
};

然后,为了得到你想要的东西,你做(例如)

var blah = config["emp1"];
console.log( JSON.stringify( blah ) );

答案 2 :(得分:0)

您可以使用for..in循环遍历对象及其子对象的不同属性名称。请参阅此处以获取您想要的示例:

function getEmp(config, section)
{
    for(var cur in config){
        if(cur == section){
            return config[cur];
        }else if(typeof config[cur] == 'object'){
            var result = getEmp(config[cur], section);
            if(typeof result != 'undefined'){
                return result;
            }
        }
    }
}

答案 3 :(得分:0)

function deepGet(root, path) {
    let output = root;
    for (const e of path) output = output[e];
    return output;
}

示例:

function deepGet(root, path) {
	let output = root;
	for (const e of path) output = output[e];
	return output;
}

const a = [];
a.b = [];
a.b.c = 'd';

console.log(deepGet(a, ['b', 'c']) === a.b.c);
console.log(deepGet(a, ['b']) === a.b);
console.log(deepGet(a, []) === a);

Benchmark

答案 4 :(得分:-1)

您可以使用eval()来执行此操作

function getEmp(config, section)
{
    return eval( "(" + config + "." + section  + ")" )
}

但你必须确保config是一个字符串,而不是一个对象。

含义:您必须像这样调用该函数:

var sec = getEmp('config','emp2');