作为培训过程的一部分,我是一名非常简单的应用程序的新开发人员 - 所以请保持温和。
我在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?
答案 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
!