5

我目前正在用 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"

   }
 }
 ]
4

8 回答 8

8

您可以使用for循环:

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

http://jsfiddle.net/cSF5w/

于 2013-02-14T23:03:36.210 回答
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/

于 2013-02-14T23:48:05.697 回答
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");
于 2013-02-26T04:12:57.853 回答
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");
于 2013-02-14T23:35:00.473 回答
0

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

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

于 2013-02-22T16:48:43.567 回答
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]);
于 2013-03-01T22:29:01.943 回答
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' )

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

于 2013-03-03T17:25:05.337 回答
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/

于 2013-03-04T14:51:56.557 回答