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

时间:2013-11-25 20:00:52

标签: 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;
          }
      ...

即使我知道长度为1,我也从未听过if语句。该长度的类型也是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;
  };

基本上我要问的是:

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

修改

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

输出相同的东西。 1或2,但不给我一个类型

1 个答案:

答案 0 :(得分:2)

如果您的对象中没有'checkboxes-lower'属性,那么JSON.parse(data)['checkboxes-lower']undefined(JSON.parse(data)['checkboxes-lower']).indexOf正在尝试执行(undefined).indexOf,这将导致错误停止在此之前执行代码,然后才能评估.length返回的数组的Object.keys()

首先测试长度,然后在尝试使用它之前测试该属性是否存在。此外,在任何地方继续致电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()返回的字符串表示形式,我将其放入一个名为{{1}的新变量中}。