如何在JSON.parsed responseText上保留hasOwnProperty?

时间:2015-07-17 04:38:33

标签: javascript php json

作为培训过程的一部分,我是一名非常简单的应用程序的新开发人员 - 所以请保持温和。

我在javascript中构建了一个函数,它接受来自其他地方的任意对象并构建合法的POST请求字符串。

代码:

    function postify(oPost){
    var out = '';
    for (key in oPost){
        if (oPost.hasOwnProperty(key) && key >0){
            if(oPost[key].value != 'Submit'){
                out += '&' + oPost[key].name + '=' + oPost[key].value;
            }
        }
    }
    return out;
}

有很多人喜欢它,但这个是我的。我选择使用hasOwnProperty作为条件,因为继承属性的总列表可能非常长。

我想传递给这个函数的一个对象是一个JSON解析的responseText对象,它是这样检索的。

function postData(str){
        var http = new XMLHttpRequest();
        http.open('POST', 'test.php',false);
        http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        http.setRequestHeader("Content-length", str.length);
        http.setRequestHeader("Connection", "close");
        http.send(str);
        var response = JSON.parse(http.responseText);
        responseHandle(response);
    }

所以,问题 - 这两个函数都完全按照它们应该做的,直到我的responseHandle函数将响应对象路由到postify函数。手动检查表明所有预期的属性都已到位,但postify()不会连接字符串,因为这些属性似乎已被继承。

我充分意识到我可以通过蛮力分配所有必要的属性 - 处理程序函数可以执行任何方式所需的操作。我也知道我的同步XMLHttpRequest已被弃用 - 就在这一秒,这就是我需要的,并且工作正常。

那么,有些问题 - 有没有办法传递我的JSON.parsed对象以保持hasOwnProperty() == true?我是否可以或应该在postify()中使用不同的属性或技术来查找故意设置的键值对?我是否应该使用POST来将我发布的对象的所有继承属性传输给PHP?

2 个答案:

答案 0 :(得分:2)

问题不在于hasOwnProperty,而在于key > 0。除非oPost是数组,否则键将是字符串。将字符串与数字进行比较时,字符串将转换为数字。但如果字符串不是数字,则转换将返回NaN,并将其与0进行比较是错误的。

你的函数不应该适用于任何对象,如果它来自JSON.parse()并不重要。当JSON.parse返回一个对象时,所有属性都是“拥有”。

修复方法是改变

if (oPost.hasOwnProperty(key) && key >0){

if (oPost.hasOwnProperty(key)){

答案 1 :(得分:0)

从JSON序列化恢复的对象除了“是一个普通对象”之外没有任何身份,所以你所得到的只是一个简单的无原型对象。

然而,不是解决这个问题,而是通过使用一些现代的JS(但不是那么现代使用ES6 / ES2015语法)解决真正的问题,即你试图使用.hasOwnProperty的问题。代替:

function postify(inputObject) {
  var keys = Object.keys(inputObject);
  return keys.filter(function(key) {
    return inputObject[key].value !== 'Submit';
  }).map(function(key) {
    var e = inputObject[key];
    return '&' + e.name + '=' + e.value;
  }).join('');
}

在第一行,我们使用JavaScript Object.keys函数中的构建来获取对象的键。然后我们filter the keys,丢弃oPost[key].value不是字符串'Submit'的任何键。然后我们build a mapping [“剩余密钥”,...] => [“& thing = whatever”,“& thing2 = moo”,...],然后我们加入这些东西,没有任何粘合剂。

完成,甚至不需要var out