[英]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.