我目前正在用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"
}
}
]
答案 0 :(得分:8)
您可以使用for
循环:
for ( key in data[0].attributes ) {
if (key.match('.dyn.prop.firmware')) {
items.push(data[0].attributes[key]);
}
}
答案 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