5

現在、いくつかの要素に json を設定しています。ただし、新しいjsonがロードされた場合。json は若干異なります。キーの最初の部分を無視して機能させるにはどうすればよいですか。アスタリスクを使用できると思っていましたが、firebug でエラーが発生します。

ここに私の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 に答える
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

他の回答のいくつかを見ると、「コピーアンドペースト」ソリューションが必要だと思います。

これが私が持っているものです。

$.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 に答える
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 に答える