使用jQuery属性从每个循环中的选择器开始

时间:2014-04-08 15:28:27

标签: jquery arrays json each startswith

我正在检索以JSON开头的localstorage字符串:

[
    {
        "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'并梳理他们的数据。我已经使用了jQuery"属性启动选择器" HTML元素的功能,包含ID或表单名称等准备选择器,例如:input[name^='news']。 JSON有这样的选择器吗?循环如:

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

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

4 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:1)

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

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

答案 2 :(得分: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)

答案 3 :(得分: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的一部分,不适用于旧版浏览器。您可以将这些更改为等效的$ .map和$ .filter的jquery。 Unfortunatley我的实验室里面没有jquery可用。 ;)