使用jquery忽略JSON调用中的部分键

时间:2013-02-14 22:46:57

标签: jquery json

我目前正在用json填充一些元素。但是如果加载了新的json。 json看起来略有不同。如何忽略密钥的第一部分以使其有效。我以为我可以使用星号,但这给了我一个萤火虫的错误。

这是我的jQuery

var items = [];
    $.each(data[0].attributes['*.dyn.prop.current.profile'], function (key, val) {
        items.push(val);
    });
    displaySortLabel(items, "type-details");

示例JSON 1

[
   {
    "avatarDefinitionId":1,
    "avatarName":"edge",
    "attributes":{
       "examplePrefixToSkipOver.act.halt":"1",
       "examplePrefixToSkipOver.dyn.prop.current.profile":"1",
       "examplePrefixToSkipOver.dyn.prop.firmware":"1.0",
       "examplePrefixToSkipOver.dyn.prop.ip.address.3g":"192.168.1.1",
       "examplePrefixToSkipOver.dyn.prop.ip.address.cloud.com":"192.168.1.1",
       "examplePrefixToSkipOver.dyn.prop.ip.address.lan":"10.0.0.1",
       "examplePrefixToSkipOver.dyn.prop.ip.address.wifi":"192.168.1.1",
       "examplePrefixToSkipOver.dyn.prop.location":"Chicago Office",
       "examplePrefixToSkipOver.dyn.prop.name":"examplePrefixToSkipOver",
       "examplePrefixToSkipOver.dyn.prop.priority":"1",
       "examplePrefixToSkipOver.dyn.prop.status.detail":"Placeholder-Text",
       "examplePrefixToSkipOver.dyn.prop.timestamp":"2010-01-01T12:00:00Z"

   }
 }
 ]

8 个答案:

答案 0 :(得分:8)

您可以使用for循环:

for ( key in data[0].attributes ) {
    if (key.match('.dyn.prop.firmware')) {
       items.push(data[0].attributes[key]);
    }
}

http://jsfiddle.net/cSF5w/

答案 1 :(得分:2)

假设对象:

var my1 = [{
    "attributes": {
        "edgebox.act.halt": "1",
            "edgebox.dyn.prop.current.profile": "1",
            "edgebox.dyn.prop.firmware": "1.0"
    }
}];
var my2 = [{
    "attributes": {
        "qln220.act.halt": "1",
            "qln220.dyn.prop.current.profile": "1",
            "qln220.dyn.prop.firmware": "1.0"
    }
}];

var items = [];

function pdata(data) {
    $.each(data, function (key, val) {
        items.push({mykey:val});
    });
}
pdata(my1[0].attributes);
pdata(my2[0].attributes);
alert(items[2].mykey);//alerts "1.0", 

此示例中的数组中有6个对象

编辑:使用相同的对象但保留键:

var items = [];

function pdata(data) {
    $.each(data, function (key, val) {
        items.push({mykey:val,origkey:key});
    });
}
pdata(my1[0].attributes);
pdata(my2[0].attributes);
alert(items[2].mykey+ ":"+items[2].origkey);// alerts "1.0:edgebox.dyn.prop.firmware"

EDIT2:剥离第一部分:

function pdata(data) {
    $.each(data, function (key, val) {
        items.push({
            mykey: val,
            origkey:(key.substring(key.indexOf(".")+1))
        });
    });
}

为你的乐趣而努力:http://jsfiddle.net/ThXHd/1/

答案 2 :(得分:2)

var items = [];
for (key in data[0].attributes) {
    if (key.match('.stat.prop.type')) {
        items.push(data[0].attributes[key])
    }
}

displaySortLabel(items, "type-details");

答案 3 :(得分:1)

因为我无法在之前的答案中添加评论。您可以使该功能通用。像这样:

function getAttributesArray(obj, matchKey) {
   var items = [];
   for ( key in obj ) {
      if (key.match(matchKey)) {
          items.push(obj[key]);
      }
   }
   return items;
}

var label = getAttributesArray(data[0].attributes, '.dyn.prop.firmware')

displaySortLabel(label, "type-details");

答案 4 :(得分:0)

如果您只想删除键的第一部分,可以在第一个索引''后切换键。并使用修改后的值映射到您的模型。

var newKey = key.slice(key.indexOf('.') + 1)

答案 5 :(得分:0)

建立Bonnarooster的例子:

function getAttribute(attr, item) {
    var items = [];
    $.each(item.attributes, function (key, val) {
        if (key.slice(key.indexOf('.') + 1) == attr) 
            items.push(val);
    });
    return items;
};

现在你可以致电:

getAttribute('dyn.prop.current.profile', data[0]);

答案 6 :(得分:0)

不幸的是我还没有对答案发表评论,但@undefined有完全正确的想法(虽然它应该检查它只匹配属性名称的结尾)。这是你如何把它放在一个函数中。

获取单个属性:

function getOneWithSuffix(obj,suffix){
    for(var key in obj){
        if(key.substr(key.length-suffix.length)===suffix){
            return obj[key];
        }
    }
    return undefined;
}
// usage: myValue = getOneWithSuffix( data[0].attributes, '.dyn.prop.current.profile' )

或者获取所有匹配属性值的数组:

function getManyWithSuffix(obj,suffix){
    var ret=[];
    for(var key in obj){
        if(key.substr(key.length-suffix.length)===suffix){
            ret.push(obj[key]);
        }
    }
    return ret;
}
// usage: myValuesArray = getManyWithSuffix( data[0].attributes, '.dyn.prop.current.profile' )

如果您想要更灵活,也可以在匹配中使用正则表达式。

答案 7 :(得分:0)

看看其他一些答案,我认为你想要一些“复制和粘贴”解决方案。

这是我得到的。

$.each(data[0].attributes, function(key, val){
     if(key.substr(key.indexOf('.',1)+1) === 'dyn.prop.current.profile')
         items.push(val);
});

我刚刚把这些人已经回答的问题放在这个小提琴中,希望它有效:D

http://jsfiddle.net/n3jca/1/