Javascript/JQuery 中的动态数组

发布于 2024-12-14 09:54:53 字数 361 浏览 0 评论 0原文

为什么我的数组长度总是为 0,即使 var email 等于字符串。 (我已经发出了 var email 的警报并且数据就在那里)。

    var emails = new Array();

    //get all the emails
    $('.emailBox input').each(function (i)
    {
        var email = $(this).val();

        if(email != '')
        {
            emails[email] = email;
            alert(emails.length);
        }
    });

Why does my array length always come out to 0 even though var email is equal to a string. (I've alerted out var email and the data is there).

    var emails = new Array();

    //get all the emails
    $('.emailBox input').each(function (i)
    {
        var email = $(this).val();

        if(email != '')
        {
            emails[email] = email;
            alert(emails.length);
        }
    });

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

诠释孤独 2024-12-21 09:54:53

因为您要向数组添加一个属性。

var a = [];
a.foo = 42;
a.length === 0; // true

相反,请尝试

emails.push(email);

这与 emails[emails.length] = email 相同

顺便说一句:

var emails = new Array() ;

很糟糕。您应该使用 [] 而不是 new Array() 主要是因为它更加简洁和可读。

if (email != '') {

上面的内容可以用 if (email) { 替换,以防 jQuery 返回 undefinednull

为了使整个代码更优雅,您应该使用

var emails = $('.emailBox input').map(function() {
    return this.value;
}).filter(function (k, v) { return v; }).get();

或不使用 jQuery,

var emails = [].map.call(document.querySelectorAll(".emailBox input"), function (v) {
    return v.value;
}).filter(function (v) { return v; });

尽管您需要 QSA 填充程序和 ES5 填充程序来支持旧平台。

编辑:

如果您希望数组是唯一的,则减少它。

var arr = arr.reduce(function (memo, val, key, arr) {
  // if the first index of the value is the index then add it.
  // if the first index is different then we already have it.
  if (arr.indexOf(val) === key) {
    memo.push(val);
  }
  return memo;
}, []);

Because you're adding a property to the array.

var a = [];
a.foo = 42;
a.length === 0; // true

Instead try

emails.push(email);

This is the same as emails[emails.length] = email

As an aside:

var emails = new Array();

Is bad. You should be using [] instead of new Array() mainly because it's more terse and readable.

if (email != '') {

The above can be replace with if (email) { in case jQuery ever returns undefined or null

To make the entire code more elegant you should use

var emails = $('.emailBox input').map(function() {
    return this.value;
}).filter(function (k, v) { return v; }).get();

Or without jQuery

var emails = [].map.call(document.querySelectorAll(".emailBox input"), function (v) {
    return v.value;
}).filter(function (v) { return v; });

Although you'll need a QSA shim and a ES5 shim for legacy platform support.

Edit:

If you want the array to be unique then reduce it.

var arr = arr.reduce(function (memo, val, key, arr) {
  // if the first index of the value is the index then add it.
  // if the first index is different then we already have it.
  if (arr.indexOf(val) === key) {
    memo.push(val);
  }
  return memo;
}, []);
时光磨忆 2024-12-21 09:54:53

您可以使用一些 jQuery 方法来完成所有这些工作。

var emails = $('.emailBox input')
              .map(function() { return $(this).val() || null; })
              .get();

jsFiddle

You could do all of that using a few jQuery methods.

var emails = $('.emailBox input')
              .map(function() { return $(this).val() || null; })
              .get();

jsFiddle.

顾北清歌寒 2024-12-21 09:54:53

emails[email] = 电子邮件没有执行您希望它执行的操作。尝试

emails.push(email);

emails[email] = email isn't doing what you want it to do. Try

emails.push(email);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文