如何使用jquery循环遍历具有嵌套对象的数组?

时间:2012-02-17 00:42:17

标签: javascript jquery arrays loops

如果我有这样的数组:

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

该数组包含客户端表单验证的全局错误消息。我设法传递错误的输入(例如“a1”),现在我想知道如何从我构造错误的数组中获取相应的消息。

问题
循环遍历此数组的最佳方法是什么?例如,如果我将“a1”作为参数传递到我的函数中,如何将“this is A”提取为相应的消息?

inArray 并没有真正帮助,因为我需要相应的消息,而不是 a1 的位置。我也不确定这是否是存储我的错误消息的最佳方式...欢迎提示!

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

重新安排您的数据结构:

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!

也称为trailing comma of death

答案 1 :(得分:1)

这就是我要做的事情

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)
}

答案 2 :(得分:0)

$.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"

答案 3 :(得分:0)

简单明了:

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