繁体   English   中英

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

[英]How to preserve hasOwnProperty on JSON.parsed responseText?

我是一个非常新的开发人员,在我的培训过程中致力于一个非常简单的应用程序-保持谦虚。

我在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已被弃用- XMLHttpRequest ,这正是我所需要的,并且工作正常。

那么,那么,有一些问题-有没有办法传递我的JSON.parsed对象,从而保持hasOwnProperty() == true 我可以或应该在postify()使用其他属性或技术来寻找故意设置的键值对吗? 我是否应该只是将POST绑定为将我要发布的对象的所有继承属性传输到PHP?

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

您的函数不应该对任何对象都起作用,它是否来自JSON.parse()都没有关系。 JSON.parse返回一个对象时,所有属性均为“所有者”。

解决办法是改变

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

if (oPost.hasOwnProperty(key)){

从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函数中的构建获取对象的键。 然后,我们过滤键 ,并丢弃oPost[key].value不是字符串'Submit'的任何键。 然后,我们建立一个 [“其余键”,...] => [“&thing = whatever”,“&thing2 = moo”,...]的映射,然后将这些东西连接起来而没有任何胶合。

完成,甚至不需要var out

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM