javascript - 获取具有定义类型的 JSON 对象长度

标签 javascript jquery json

我看到了有关查找 JSON 对象长度的问题和答案,只是为了了解。但是,稍后我需要使用 IF 语句对其进行检查,并且我得到了一个 undefined 类型的长度。

当我这样做时:

$(function() {
      $('#filter_search').click(function() {               
          var data = JSON.stringify($('#filterform').serializeObject());
          var fetch = true;
          if ((JSON.parse(data)['checkboxes-lower'].indexOf("foo") == -1 && JSON.parse(data)['checkboxes-lower'].indexOf("bar") == -1) || (Object.keys(JSON.parse(data)).length == 1))  {
              alert("Please input at least one option");
              fetch = false;
          }
      ...

我从来没有捕捉到那个 if 语句,即使我知道长度是 1。那个长度的类型也是 undefined。我怎样才能获得有意义的(意味着我可以在这个 if 语句中使用)返回 JSON 对象的长度?

我的 JSON 对象总是长度为 1 或长度为 2。它看起来像这样:

{"checkboxes":"foo","checkboxes-lower":["bar", "tar"]}

或者看起来像这样:

{"checkboxes":["foo", "bar"]}

以上是我运行时输出的内容:

alert(JSON.stringify($('#filterform').serializeObject()));

其中 serializeObject 是:

$.fn.serializeObject = function() {
      var o = {};
      var a = this.serializeArray();
      $.each(a, function() {
          if (o[this.name]) {
              if (!o[this.name].push) {
                  o[this.name] = [o[this.name]];
              }
              o[this.name].push(this.value || '');
          } else {
              o[this.name] = this.value || '';
          }
      });
      return o;
  };

基本上我要问的是:

在执行 Object.keys(data) 时,我如何返回除 undefined 变量之外的任何内容?它可以是字符串、整数,等等。只要我能在 if 语句中检查是否相等。

编辑

console.log(Object.keys(JSON.parse(data)).length);

输出相同的东西。 1 或 2,但没有给我类型

最佳答案

如果对象中没有 'checkboxes-lower' 属性,则 JSON.parse(data)['checkboxes-lower']undefined(JSON.parse(data)['checkboxes-lower']).indexOf 正在尝试执行 (undefined).indexOf 这将给出一个错误在它可以评估 Object.keys() 返回的数组的 .length 之前停止执行您的代码。

首先测试长度,并在尝试使用它之前测试该属性是否存在。此外,到处调用 JSON.parse() 非常困惑。为什么不保留对该对象的引用:

      var data = $('#filterform').serializeObject(),
          json = JSON.stringify(data),
          fetch = true;
      if (Object.keys(data).length == 1 ||
               !data['checkboxes-lower'] ||     // test that property exists before using
               data['checkboxes-lower'].indexOf("foo") == -1 && // .indexOf on it
               data['checkboxes-lower'].indexOf("bar") == -1)  {
          alert("Please input at least one option");
          fetch = false;
      }

(此外,我认为您不需要使用 .indexOf() 来分别测试 "foo""bar" ,因为从您的描述来看,如果 'checkboxes-lower' 属性完全存在,它将始终是一个至少包含这两个选项之一的数组。所以 !data[' checkboxes-lower'] 测试可能就足够了吗?)

顺便说一下,there's no such thing as a JSON object .你要么有一个对象(data,在我展示的代码中),要么你有 JSON,它是 JSON.stringify() 返回的字符串表示,我已经放入一个名为 json 的新变量。

关于javascript - 获取具有定义类型的 JSON 对象长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20202131/

相关文章:

javascript - 如何在 highstock 基本线图上绘制多条线?

javascript - 如何获取Flot Chart的当前条宽?

python - 将多个文件中的 json 对象逐行合并到一个文件中

ruby-on-rails - `block in <main>' : undefined method `[]' for nil:NilClass (NoMethodError)

javascript - 使用 angularjs 渲染表格

javascript - 对因子捆绑的部分捆绑进行一些操作

javascript - 我不知道如何修复此代码

javascript - 检查 AngularJS 中自定义指令的输入

javascript - 如果数组中存在 url 则执行某些操作

javascript - 当段落和文本动态围绕 URL 时,如何在 &lt;textarea&gt; 中查找 URL?