2014-02-12 2 views
0

У меня есть массив имен/значений JSON, и я ищу разумный способ настроить значение для определенного имени в массиве. напримерПолучение значения из json/javascript массива пар имя/значение?

var myArr = [{"name":"start","value":1},{"name":"end","value":15},{"name":"counter","value":"6"},{"name":"user","value":"Bert"}] 

я могу использовать

$.each(myArr, function (key, pair) { 
if (pair.name == 'user') 
{ 
    pair.value = 'bob'; 
} 
}); 

, но на самом деле мой объект имеет десятки значений, и я хотел бы быть в состоянии изменить их гораздо проще, чем добавление if для каждого из них.

В идеале myArr['user'].value = 'bob'; или что-то подобное.

+0

Если вы выполняете программирование на стороне сервера, вы можете преобразовать его в массив типа JSON/GSON и затем перебрать его, чтобы получить KVP. –

+0

@BlueChippy Если возможно, то я рекомендую вам изменить структуру json на что-то вроде этого: '{" start ": 1", end ": 15," counter ": 6," user ":" Bert "}' – bits

ответ

0

У вас есть массив объектов в массиве. Массив не имеет никакого метода индексирования, который дает вам прямой поиск, как вы просили;

myArr['user'].value = 'bob'; 

Чтобы получить, что вам нужно будет перестроить свои данные так, чтобы у вас был объект, где имя было основным ключом и внутри этого ключа был другой объект с остальными данными для этого пользователя, как это:

var myData = { 
    "start": {value: 1}, 
    "end": {value: 15}, 
    "user": {value: Bert} 
}; 

, вы сразу могли получить доступ по имени, как в:

myData['user'].value = 'bob; 

Если вы хотите s тик с существующей структурой данных, то самое простое, что я могу думать о том, чтобы сделать простую функцию, которая находит правильный объект:

function findUser(data, nameToFind) { 
    var item; 
    for (var i = 0; i < myArr.length; i++) { 
     item = nameToFind[i]; 
     if (item.name === nameToFind) { 
      return item; 
     } 
    } 
} 

var myArr = [{"name":"start","value":1},{"name":"end","value":15},{"name":"counter","value":"6"},{"name":"user","value":"Bert"}] 

Тогда вы могли бы сделать что-то вроде этого:

findUser(myArr, "user").value = "bob"; 

Это предполагает, что вы ищете только данные, находящиеся в массиве, потому что иначе это создаст ошибку, если вы не добавите к ней проверку ошибок.


Если вы только действительно хотите, чтобы превратить все это в функцию, которая находит и меняет имя, это может быть так:

function changeUser(data, nameToFind, newName) { 
    var item; 
    for (var i = 0; i < myArr.length; i++) { 
     item = nameToFind[i]; 
     if (item.name === nameToFind) { 
      item.name = newName; 
      return; 
     } 
    } 
} 
+0

Sadly не может реструктурировать, а не мои данные :( – BlueChippy

+0

@BlueChippy - они не могут делать то, о чем вы просите, потому что массив не индексируется по ключу, как объект - это просто плоский список записей. я добавил еще одну альтернативу моему ответу без реструктуризации данных. – jfriend00

+0

Точно ... Было бы проще работать с json, как этот '{" start ": 1", end ": 15," counter ": 6," user " : «Bert»} ' – bits

0

Добавьте эту функцию:

function SetArrayValue(arr, key, value, stopOnFirstMatch) { 
    for (var i=0; i<arr.length; i++) { 
    if (arr[i].name === key) { 
     arr[i].value = value 
     if (stopOnFirstMatch !== undefined && stopOnFirstMatch) return 
    } 
    } 
} 

Затем используйте его следующим образом:

SetArrayValue(myArr, 'user', 'bob') 
+0

Более перспективный - но есть ли способ остановить итерацию, если он найден - поэтому, если я устанавливаю второе значение, оно останавливается после повторения второго значения? – BlueChippy

+1

Вы действительно хотите применить только первое совпадение? у вас есть несколько значений для одной клавиши – HanS

+0

Хорошая точка, однако я знаю, что в этом конкретном случае «Имя» будет уникальным для каждого значения. – BlueChippy

0

Я наградит баллов за лучший ответ, но я на самом деле решил это совершенно по-другому:

сначала постройте список «имена» в порядке их появления:

var keys = []; 
$.each(myArr, function (key, pair) { 
keys.push(pair.name); 
}); 

то я могу Применение:

myArr[keys.indexOf('sEcho')].value = 'whatever'; 
0

Try This $ .grep (myArr, функция (е) {вернуться e.name == "пользователь"}) [0].value = "ppp"

Вы можете использовать $ .greb() jquery.

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