Как пройти через массив с вложенными объектами, используя jquery? - PullRequest
0 голосов
/ 17 февраля 2012

если у меня есть такой массив:

var msg = [ {name: ["a1", "a2"], value: "this is A"},
            {name: ["b1", "b2"], value: "this is B"},
            ...
          ]

Массив содержит сообщения о глобальных ошибках для проверки формы на стороне клиента. Мне удалось передать ошибочные данные (например, «a1»), и теперь я задаюсь вопросом, как получить соответствующее сообщение из моего плохо сконструированного массива.

Вопрос
Что было бы лучшим способом перебрать этот массив? например, если у меня есть «a1» в качестве параметра, переданного в мою функцию, как мне извлечь «this is A» как соответствующее сообщение?

inArray не очень помогает, потому что мне нужно соответствующее сообщение, а не позиция a1 . Я также не уверен, что это лучший способ хранить мои сообщения об ошибках ... идеи приветствуются!

Спасибо за помощь!

Ответы [ 4 ]

3 голосов
/ 17 февраля 2012

Перестройте структуру данных:

var my_param = 'b1';

// This is an object, so we can have key/value pairs
var error_codes =
{
    'a1': 0,
    'a2': 0,
    'b1': 1,
    'b2': 1
};

// This is an array because we only need values
var error_messages =
[
    'This is A',
    'This is b'
];

alert(error_messages[error_codes[my_param]]);

Это позволяет легко устанавливать новые коды ошибок и сообщения и чрезвычайно легко понять. Единственное, что надо - это error_codes[my_param] - это объект, но мы не можем сделать error_codes.my_param, потому что он будет искать элемент с именем 'my_param', поэтому, используя обозначение массива, мы можем найти ключ объекта.

Единственная другая потенциальная ловушка - убедиться, что у вас нет запятых:

var error_codes = { 'a1': 1, }; // NO!

Также известен как конечная запятая смерти !

1 голос
/ 17 февраля 2012

Это было бы так, как я бы это сделал

var myMsg = findMsg('a1')


function findMsg(msgType){
  msg.forEach(function(obj){
    if(inArray(msgType, obj.name) !== -1){
      return obj.value
    }
  })
}

function inArray(key, obj){
 return obj.join().indexOf(key)
}
0 голосов
/ 17 февраля 2012

Красиво и просто:

var getMessage = function (name)
{
    var msg = [ ... ];

    for(var i = 0; i < msg.length; ++ i)
        if (msg [i].name.indexOf (name) != -1)
            return msg [i].value;
}

Возвращает либо соответствующее сообщение, либо undefined, если имя не найдено.

Для indexOf может потребоваться прокладка в зависимости от того, какие браузеры вы хотите поддерживать:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf

0 голосов
/ 17 февраля 2012

$.each - это способ jQuery для выполнения действий над каждым элементом массива или каждым перечисляемым свойством объекта.

var value;
$.each(msg, function (i, el) {
  if (el.name.indexOf(name) >= 0) {
    value = el.value;
    return false;  // Stops iteration.
  }
});

Если name равно "a1"затем, выполнив вышеуказанное, value === "this is A".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...