【问题标题】:console.log(array) returns empty, but console.log(array.length) doesn't return 0console.log(array) 返回空,但 console.log(array.length) 不返回 0
【发布时间】:2016-04-24 15:57:52
【问题描述】:

我有以下 javascript

var filtered = [];

$('#footballCheck').on('change', function() {
  if ($('#footballCheck').is(':checked')) {
    for (var i = 0; i < fa_names.length; i++) {
      if (fa_names[i]["facility_activity"].toLowerCase().indexOf("football") >= 0) {
        filtered.push(fa_names[i]);
      }
    }

    filtered.sort(SortByName);
    $('#mCSB_1_container').empty(".facility-name");
    for (var k = 0; k < filtered.length; k++) {
      $('#mCSB_1_container').append('<div class="row facility-name">\
                                             <button class="btn btn-default btn-fill btn-menu" date-name="' + filtered[k]["facility_name"] + '">' + filtered[k]["facility_name"] + '</button></div>');
      $('#facilities-body').mCustomScrollbar("update");
    }
  } else {
    for (var j = 0; j < filtered.length; j++) {
      if (filtered[j]["facility_activity"].toLowerCase().indexOf("football") >= 0) {
        delete filtered[j];
      }
    }
    console.log(filtered);
    console.log(filtered.length);
    if (filtered.length > 0) {
      filtered.sort(SortByName);
      $('#mCSB_1_container').empty(".facility-name");
      for (var k = 0; k < filtered.length; k++) {
        $('#mCSB_1_container').append('<div class="row facility-name">\
                                                 <button class="btn btn-default btn-fill btn-menu" date-name="' + filtered[k]["facility_name"] + '">' + filtered[k]["facility_name"] + '</button></div>');
        $('#facilities-body').mCustomScrollbar("update");
      }
    } else {
      $('#mCSB_1_container').empty(".facility-name");
      for (k = 0; k < fa_names.length; k++) {
        $('#mCSB_1_container').append('<div class="row facility-name">\
                                                 <button class="btn btn-default btn-fill btn-menu" date-name="' + fa_names[k]["facility_name"] + '">' + fa_names[k]["facility_name"] + '</button></div>');
        $('#facilities-body').mCustomScrollbar("update");
      }
    }
  }
});

应该执行以下操作:

  • 如果选中该复选框,则遍历另一个数组并将键值“facility_activity”包含“football”的所有对象推送到filtered数组
  • 如果未选中,则从filtered数组中删除键值“facility_activity”包含“football”的所有对象
  • 如果未选中且其长度 > 0(表示仍有过滤的对象)打印那些
  • 如果未选中且filtered 数组为空,则追加父数组中的所有项(未过滤的项)

这里是fiddle

背景:复选框充当搜索过滤器,filtered 数组存储这些过滤后的值(在除此之外的其他地方,filtered 数组尚未更改)。

我的问题是 console.log(filtered) 返回 []console.log(filtered.length) 不返回 0 并且它应该返回。为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 你使用delete从数组中移除元素,使用splice
  • 代码进入问题in,而不仅仅是链接。
  • 如果您想回复有关重复的内容,请将其作为评论进行,而不是将其添加到问题中。你是对的,另一个问题并不是真正的重复。但是,如果您立即发布相关代码并且确保代码是准确重现问题的minimal example,您将获得更好的接收。
  • @squint 老实说,我的代码只有从整体上看才有意义(我只将它包含在一个小提琴中,以便通过不占用太多空间来提高问题的可读性)。如果不是重复的,可以去掉标签吗?感谢您的反馈!
  • 这里是一个简化的例子:jsfiddle.net/mtx5Lg1L/3 所有的 DOM 操作和条件只会妨碍。如果你一件一件地挑选东西,你可以把它归结为非常简单的东西。甚至我的演示也可以进一步简化,但它通常在其核心传达了代码中发生的事情。

标签: javascript jquery


【解决方案1】:

数组上的delete 不会更改数组的length。它只是将元素值设置为undefined。使用splice 从数组中删除元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2021-10-26
    • 2017-07-08
    • 2017-09-06
    • 1970-01-01
    • 2015-11-24
    • 2015-11-12
    相关资源
    最近更新 更多