ObjectToQuery函数只返回属性有值但我想要所有的属性

时间:2015-10-26 18:09:33

标签: javascript jquery ajax

我正在使用此方法将Object转换为 QueryString ajax发送请求需要 QueryString

var objectToQueryString = function(a) {
  var prefix, s, add, name, r20, output;
  s = [];
  r20 = /%20/g;
  add = function(key, value) {
    // If value is a function, invoke it and return its value
    value = (typeof value == 'function') ? value() : (value == null ? "" : value);
    s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
  };
  if (a instanceof Array) {
    for (name in a) {
      add(name, a[name]);
    }
  } else {
    for (prefix in a) {
      buildParams(prefix, a[prefix], add);
    }
  }
  output = s.join("&").replace(r20, "+");
  return output;
};

function buildParams(prefix, obj, add) {
  var name, i, l, rbracket;
  rbracket = /\[\]$/;
  if (obj instanceof Array) {
    for (i = 0, l = obj.length; i < l; i++) {
      if (rbracket.test(prefix)) {
        add(prefix, obj[i]);
      } else {
        buildParams(prefix + "%" + (typeof obj[i] === "object" ? i : "") + "%", obj[i], add);
      }
    }
  } else if (typeof obj == "object") {
    // Serialize object item.
    for (name in obj) {
      buildParams(prefix + "%" + name + "%", obj[name], add);
    }
  } else {
    // Serialize scalar item.
    add(prefix, obj);
  }
}

以下代码成功地将对象转换为 QueryString ,但在返回 QueryString 中省略了没有值的属性。
但我想要对象的所有属性。对象属性是否有价值无关紧要。

1 个答案:

答案 0 :(得分:0)

如果您传递值为null的属性,则此调用中的'obj'参数将为null

function buildParams(prefix, obj, add) {

您可以在将“buildParams”功能更改为此时测试结果:

function buildParams(prefix, obj, add) {
    obj = obj || "";
    var name, i, l, rbracket;
    rbracket = /\[\]$/;
    if (obj instanceof Array) {
        for (i = 0, l = obj.length; i < l; i++) {
            if (rbracket.test(prefix)) {
                add(prefix, obj[i]);
            } else {
                buildParams(prefix + "%" + (typeof obj[i] === "object" ? i : "") + "%", obj[i], add);
            }
        }
    } else if (typeof obj == "object") {
        // Serialize object item.
        for (name in obj) {
            buildParams(prefix + "%" + name + "%", obj[name], add);
        }
    } else {
        // Serialize scalar item.
        add(prefix, obj);
    }
}