.each没有在数组上工作.但.isArray返回true?

McB*_*McB 5 javascript arrays jquery object

我创建了一个包含一些项目的对象,包括一个包含多个对象的对象,每个对象都包含一个数组.以下是它的结构.

$.myVar = {
    cp : "",
    ps : {
        m1 : ["001", "002", "003"],
        m2 : ["002", "004"]
    }
};
Run Code Online (Sandbox Code Playgroud)

我的脚本一直在崩溃说$ .myVar.ps ["m1"]每个都没有方法.

当我进入Chrome的控制台进行调查时,我运行以下内容并获取显示的输出.

$.myVar.ps["m1"]
["001", "002", "003"]
$.myVar.ps["m1"].each( function (i, p) {alert(i)})
TypeError: Object 001,002,003 has no method 'each'
Run Code Online (Sandbox Code Playgroud)

此外,如果我运行以下内容,它证明m1是一个数组.

$.isArray($.myVar.ps["m1"])
true
Run Code Online (Sandbox Code Playgroud)

所以似乎同意m1是一个数组,但它拒绝这样对待它.知道我做错了什么吗?

Dom*_*nic 19

each不是本地Array方法; 它是jQuery对象的方法,即由$函数创建的对象.你可以这样做

$($.myVar.ps.m1).each(function (i, el) { /* ... */ });
Run Code Online (Sandbox Code Playgroud)

(不推荐,因为它在包装数组时会创建一个不必要的jQuery对象$(...)),或者你可以使用$.each:

$.each($.myVar.ps.m1, function (i, el) { /* ... */ });
Run Code Online (Sandbox Code Playgroud)

如果您使用的是现代浏览器(IE> = 9)或使用es5-shim,最推荐的路线是使用标准Array.prototype.forEach方法:

$.myVar.ps.m1.forEach(function (el, i) { /* ... */ });
Run Code Online (Sandbox Code Playgroud)

注意不同的参数顺序(IMO更好,因为如果你不需要它,你可以省略索引).


ken*_*ytm 7

.each仅为jQuery对象定义.对于纯Javascript数组,请使用"静态方法"$.each.

$.each($.myVar.ps["m1"], function(i,p) { alert(i); });
Run Code Online (Sandbox Code Playgroud)