0

给定 localStorage 中的大型 JSON 表和用户提供的给定键,我访问关联的值。但是如果值和/或键不存在,那么我想创建它们。然而...

给定以下 JSON:

var data = [ 
{ 'myKey': 'A', 'status': 0 },
{ 'myKey': 'B', 'status': 1 },
{ 'myKey': 'C' },
{ 'myKey': 'D', 'status': 1 }
];

以及以下JS:

function getJsonVal(json, itemId) {
    for (var i in json) {
        if (json[i].myKey == itemId) {
            return json[i]; 
        }
    }
}

如果我...

// request non-existing-in-JSON value:
valC = getJsonVal(data, 'C');
alert("this is C's value: "+ valC)

或者

// request non-existing-in-JSON key:
keyE = getJsonVal(data, 'E');
alert("this is E: "+ keyE);

脚本只是中途停止。

我希望有一些错误值允许我制作类似的东西If ( null|| undefined ) Then create new key/value,但我的脚本只是停止,因为这些项目不存在。有什么解决办法吗?Jsfiddle 赞赏。

4

4 回答 4

1

使用 typeof 运算符,您可以安全地检查是否设置了属性

function getJsonVal(json, itemId) {
    for (var i in json) {
        if (typeof json[i].myKey != 'undefined' && json[i].myKey == itemId) {
            return json[i]; 
        }
    }
    return 'someDefault';
}
于 2013-02-08T23:46:01.857 回答
1

我对您的示例代码的修订:

http://jsfiddle.net/dqLWP/

var data = [ 
{ 'myKey': 'A', 'status': 0 },
{ 'myKey': 'B', 'status': 1 },
{ 'myKey': 'C' },
{ 'myKey': 'D', 'status': 1 }
];

function getJsonVal(json, itemId) {
    for (var i in json) {
        if (json[i].myKey == itemId) {
            return json[i]; 
        }
    }
}

var output = getJsonVal(data, 'E');
alert("this is the outputted value: "+ output);

if ( ! output) {
    alert('time to create that new key/value you wanted');
}
于 2013-02-08T23:49:55.617 回答
0

C除非您正在为变量和某处设置值,否则您E需要将它们放在引号中:

// request non-existing-in-JSON value:
valC = getJsonVal(data, 'C');
alert("this is C's value: "+ valC)

// request non-existing-in-JSON key:
keyE = getJsonVal(data, 'E');
alert("this is E: "+ keyE);

此外,您应该提醒您设置的变量(valCkeyE)。

于 2013-02-08T23:44:21.180 回答
0

为了改进林登的回答:

function getJsonVal(json, itemId) {
    for (var i in json) {
        if (json[i].myKey == itemId) {
            return json[i].status; // add .status here so you can see the value of keys that exist and have one.
        }
    }
}
于 2017-05-31T19:44:10.447 回答