2009-12-17 2 views
2

Я получаю JSON пар имя/значение, которое выглядит следующим образом:Javascript пары доступа имя/значение

{ 
    "Name":"parentid", 
    "Value":"blah" 
}, 
{ 
    "Name":"siteid", 
    "Value":"blah" 
}, 
{ 
    "Name":"sitename", 
    "Value":"blah" 
} 

Но я хотел бы получить доступ к «имя» значение в качестве ключа, а «значение» значение как значение VALUE. Есть ли элегантный способ превратить этот кусок JSON в нечто подобное?

{'parentid', 'blah'}, 
{'sitename', 'blah'} 

ответ

5

Попробуйте это:

var items = [ 
    { 
     "Name":"parentid", 
     "Value":"blah" 
    }, 
    { 
     "Name":"siteid", 
     "Value":"blah" 
    }, 
    { 
     "Name":"sitename", 
     "Value":"blah" 
    } 
]; 

var results = new Object(); 

for (var i = 0; i < items.length; i++) 
{ 
    results[items[i].Name] = items[i].Value; 
} 

Это приведет к чему-то вроде:

var results = { parentid: "Blah", siteid: "Blah", sitename: "Blah" }; 
-1

Я предполагаю, что вы используете PHP и PHP эхо вам assosiatice Арай, как это:

echo json_encode($result); 

В вашем javascript вы можете сделать следующее:

// Soemthing retrieves php result and puts it in `var result`. 
data = eval("(" + result+ ")"); 
alert(data.parentid); 

Я не уверен, что это то, что вы хотите, но это решение.

1
function objectflatten (array) { 
    var out = {}, i; 
    for(i = 0; i < array.length; i++) { 
    out[array[i].name] = array[i].value; 
    } 
    return out; 
} 

Это функция, которая будет принимать объект в форме вы представили, и выход его в качестве «нормального» объекта со значениями имен, как ключи и значения значений в качестве значений.

2

Один из способов сделать это.

var json = [ 
    { 
    "Name":"parentid", 
    "Value":"blah" 
    }, 
    { 
    "Name":"siteid", 
    "Value":"blah" 
    }, 
    { 
    "Name":"sitename", 
    "Value":"blah" 
    } 
]; 

for (var i = 0, l = json.length, obj; i < l; i++) 
{ 
    obj = json[i]; 
    json[i] = new Object(); 
    json[i][obj.Name] = obj.Value; 
} 

// console.log() requires Firebug 
console.log(json); 
+0

Вместо вызова Object(), почему бы не просто: 'json [i] = {obj.Name: obj.Value}' – jpsimons

1

Я бы рекомендовал использовать метод for(... in ...) для выполнения этой задачи. Он схватит ключевые имена, как вам нужно.

var jsonObj = eval('([{ "Name":"parentid", "Value":"blah" }])'); 

for(var i = 0, assoc = {}, key; i < jsonObj.length; ++i) 
{ 
    for(key in jsonObj[ i ]) // <-- this right here 
    { 
     assoc[ key ] = jsonObj[ i ][ key ]; 
    } 
} 

и вы в конечном итоге с (из Firebug)

Object Name=parentid Value=blah

, которые могут быть доступны object.key или объект [ 'ключ'] (в нашем случае assoc.Name или доц [ 'Value'])

вот ссылка от Douglas Crockford от Yahoo! об использовании его также - http://yuiblog.com/blog/2006/09/26/for-in-intrigue/

+0

Будьте осторожны, потому что вы, возможно, вещи, которые вы не знаете, есть, потому что они были унаследованы. См. Раздел «for in» здесь: http://www.jslint.com/lint.html –

+0

Вы правы, чтобы быть «более безопасным», вы можете использовать метод Крокка для (имя в объекте) { if (object.hasOwnProperty (name)) {....} } , но в JSON вы анализируете или оцениваете объект (объект), поэтому не должно быть никакого мусора, как если бы вы сделали это узел DOM (попробуйте мой код, проверьте результат «assoc» на вкладке DOM Firebug, нажав на возвращаемое значение). –

Смежные вопросы