1

我正在检索一个以 JSON 开头的本地存储字符串:

[
    {
        "Key01": "Val01",
        "Key02": "Val02",
        "Key03": "Val03",
        "KeyInfo1": [
            {
                "KIName": "KIVal01",
                "KIId": "KIVal02"
            }
        ],
        "KeyInfo2": [
            {
                "KIName": "KIVal03",
                "KIId": "KIVal04"
            }
        ],
        "KeyInfo3": [
            {
                "KIName": "KIVal05",
                "KIId": "KIVal06"
            }
        ]
    }
]

并将其转换回 JSON 数组:

var stuff = localStorage.getItem("ls");
var testparse = $.parseJSON(stuff);

我希望能够运行一个 jQuery$.each()循环来仅隔离名称以“KeyInfo”开头的数组并梳理出它们的数据。我在 HTML 元素上使用了 jQuery 的“属性以选择器开头”功能,这些元素具有现成的选择器,例如 ID 或表单名称,例如:input[name^='news']. JSON 中是否有这样的选择器?像这样的循环:

$.each(testparse[0]."[key^='KeyInfo']"[0], function(key, value){
        console.log(key + ' = ' + value);
    });

可以理解地抛出 a Uncaught SyntaxError: Unexpected string,因为我在将自己设置为与 $.each() 循环关联的函数中的属性之前尝试访问一个键。这样的场景可行吗?如果没有,有人可以推荐一种方法来隔离那些以“KeyInfo”开头的数组吗?

4

4 回答 4

1

像这样使用jQuery.map ..

var filtered = $.map( test[0], function( n, i) {
    return /^keyInfo/i.test(i) ? n : null;
});

$.each(filtered , function(key, value){
    console.log(value);
});
于 2014-04-08T15:41:03.067 回答
1

您可以对每个键进行简单检查,以查看它们是否以“KeyInfo”开头。

$.each(testparse[0], function(key, value){
    if (key.indexOf('KeyInfo') === 0) {
        console.log(key + ' = ' + value);
    }
});
于 2014-04-08T15:43:14.460 回答
1

http://jsfiddle.net/7r6Vu/

您基本上会得到没有以 keyInfo 开头的键的原始对象。

var testparse = [
    {
        "Key01": "Val01",
        "Key02": "Val02",
        "Key03": "Val03",
        "KeyInfo1": [
            {
                "KIName": "KIVal01",
                "KIId": "KIVal02"
            }
        ],
        "KeyInfo2": [
            {
                "KIName": "KIVal03",
                "KIId": "KIVal04"
            }
        ],
        "KeyInfo3": [
            {
                "KIName": "KIVal05",
                "KIId": "KIVal06"
            }
        ]
    }
]

testparse = $.map(testparse[0], function(value, key) {
    if (key.match(/^KeyInfo/)) {
        var res = {}
        res[key] = value
        return res
    }
})

console.log(testparse)
于 2014-04-08T15:47:28.527 回答
1

我试了一下。像这样:

var keys = Object.keys(testparse[0]);

var result = keys.filter(function(val){
    return !val.indexOf('KeyInfo'); //Isolate/Filter keys
}).map(function(val, i){
    var res = {}; //Create a new object
    res[val] = testparse[0][val] //Reassign the key/value pairs
    return res;
    //Or maybe do your stuff instead.
})

console.log(result);
/*[ { KeyInfo1: [ { KIName: 'KIVal01', KIId: 'KIVal02' } ] },
{ KeyInfo2: [ { KIName: 'KIVal03', KIId: 'KIVal04' } ] },
{ KeyInfo3: [ { KIName: 'KIVal05', KIId: 'KIVal06' } ] } ]*/

编辑:注意 array.map 和 array.filter 是 ECMAScript 5 的一部分,不能在旧浏览器中工作。您可以将这些更改为 jquery 等效的 $.map 和 $.filter。不幸的是,我的实验室 atm 中没有可用的 jquery。;)

于 2014-04-08T16:37:39.763 回答