JavaScript - 从动态密钥获取键/值数据到动态密钥

时间:2015-05-12 14:11:08

标签: javascript jquery json

我有一个包含两个嵌套动态密钥的var数据。

我没有读取密钥的内容值" key_1"

var A = '"' + 123456789 + '"';
var B = '"' + 987654321 + '"';

var AA = '"' + 42 + '"';

var data = {
    "123456789":{
        "42":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_2":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_3":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        }
    },
    "987654321":{
        "DYNAMIC_KEY_1":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_2":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_3":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        }
    }
}

alert(data[A][AA]["key_1"]);

未捕获的TypeError: 无法读取属性'" 42"'未定义的

我尝试了几种解决方案,但事实并非如此!

有人可以解释一下如何继续吗?谢谢:))

---更新---

很奇怪,应用你的建议,我仍然有同样的错误...

在我的代码中,var A是一个由函数中的数值变量提供的全局变量(productID)。

var AA也对应于另一个通常作为数字变量的文件中的变量(userID)。

    var room;

    function ioJoin(Mid){

        room = Mid;

        var _localuserid = LS.wpbp.id;

        var trackdata = {};
        var users = {};

        users[_localuserid] = {
            active: true,
            time: $.now(),
            user: LS.wpbp.id,
            productID: Mid
        }

        trackdata[Mid] = users

        socket.emit('send:newuser', trackdata);

    }

    socket.on("load:joinroom", function(data) {

        var _localuserid = LS.wpbp.id;

        // room & _localuserid are numbers
        alert(data[room][_localuserid]["active"]);

    });

我真的不明白这是什么问题!

3 个答案:

答案 0 :(得分:1)

不要在您的媒体名称中加上引号。 '"' + 123456789 + '"'为您提供值'"123456789"'(请注意,开头和结尾都是双引号,实际上字符串中)。你只想要'123456789'

所以:

var A = '123456789';
var B = '987654321';

var AA = '42';

直播示例:

var A = '123456789';
var B = '987654321';

var AA = '42';

var data = {
    "123456789":{
        "42":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_2":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_3":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        }
    },
    "987654321":{
        "DYNAMIC_KEY_1":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_2":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_3":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        }
    }
}

alert(data[A][AA]["key_1"]);

对于其中没有前导零的那些,你甚至可以完全取消引号并使用数字(这将被[]强制转换为字符串)。

直播示例:

var A = 123456789;
var B = 987654321;

var AA = 42;

var data = {
    "123456789":{
        "42":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_2":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_3":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        }
    },
    "987654321":{
        "DYNAMIC_KEY_1":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_2":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_3":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        }
    }
}

alert(data[A][AA]["key_1"]);

答案 1 :(得分:0)

替换:

var A = '"' + 123456789 + '"';
var B = '"' + 987654321 + '"';
var AA = '"' + 42 + '"';

使用:

var A = '' + 123456789;
var B = '' + 987654321;
var AA = '' + 42;

或者更好的是,只需将它们声明为字符串:

var A = '123456789';
var B = '987654321';
var AA = '42';

您不需要添加那些额外的引号,这些引号只会导致像'"123456789"'这样的字符串,而这些字符串在对象中找不到。

然后它会起作用:

直播示例:

var A = '123456789';
var B = '987654321';
var AA = '42';

var data = {
    "123456789":{
        "42":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_2":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_3":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        }
    },
    "987654321":{
        "DYNAMIC_KEY_1":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_2":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        },
        "DYNAMIC_KEY_3":{
            "key_1":"value_1",
            "key_2":"value_2",
            "key_3":"value_3"
        }
    }
}

alert(data[A][AA]["key_1"]);

答案 2 :(得分:0)

这不一定是答案,但看看你写alert(data[A][AA]["key_1"]);的方式,我认为提供更多信息很重要。

第1点: - key_1

如果您需要将密钥key_1放入变量中,您可以写一下:

var AAA = 'key_1';
alert( data[A][AA][AAA] );

这是正确的。 现在,您可以继续使用其他键进行相同的推理。可视化:

提醒(数据[' 123456789'] [' 42'] [' key_1']);

因此,您可以了解为什么必须var A = '123456789';var AA = '42';

第2点: - 出发点

现在,当涉及dot表示法时,不能在以数字[0-1]开头的键上使用点表示法。因此,你不能写:

alert( data.123456789.42.key_1 ); //BAD

但你可以写:

alert( data['123456789']['42'].key_1 ); //GOOD