JQuery在发送时删除空数组
我有以下代码:JQuery在发送时删除空数组,jquery,ajax,arrays,object,Jquery,Ajax,Arrays,Object,我有以下代码: $.post('block_ajax.php' , { 'action': 'set_layout' , 'listid': 123 , 'layout': [] } , function(data) { // ... } ); 接收脚本(block_ajax.php)只接收“action”和“listid”参数。当我检查使用Chrome发送的内容时,我看
$.post('block_ajax.php'
, { 'action': 'set_layout'
, 'listid': 123
, 'layout': []
}
, function(data) {
// ...
}
);
接收脚本(block_ajax.php)只接收“action”和“listid”参数。当我检查使用Chrome发送的内容时,我看到“layout”参数甚至没有发送到后端脚本
由于空数组和不存在数组之间存在差异,我希望JQuery发送空数组。我可以找到一些迹象表明JQuery(1.6.1)似乎做到了这一点,但没有找到阻止它这样做的方法。JSON格式允许空数组和空对象,所以我认为这应该是可能的
有人知道要更改什么才能让JQuery发送空数组吗?编辑:有关更好的解决方案,请参阅Luke的答案: 正如上面的链接所解释的,我在下面留下了我之前的答案,具体说明Rails如何处理
[“”]
注意:特定于Rails 我不知道为什么需要发送一个空白参数。仅仅检查PHP脚本中是否存在参数就足够了。但是,如果您确实想这样做,请使用
'layout':[“”]
而不是'layout':[]
。应发送参数
(此外,您可能希望将布局
重命名为布局[]
,以指示它是一个数组,但这是不必要的。)尝试以下操作:
(isset($_POST['layout'])) ? $_POST['layout'] : array();
如果传递的数组为空,则要获取新的空数组,否则将使用包含数据的“实”数组。我认为json在这种情况下会有所帮助 用js编码数组并发送结果,然后用php解码
但这需要一些资源我们的组织有两种解决问题的方法:
- 将数据作为JSON而不是POST数据发送是一种很好的通用方法,尽管有时与Rails等框架集成有点困难,因为您可能需要添加显式后端调用来解码JSON数据
- 正如vinod所指出的那样,
可以很好地工作,因为许多框架(例如Rails)通常会将其视为一个空数组。(有关原因,请参见)。[“”]
- 注意:当尝试与Rails的某些方面集成时,尤其是当发送一个由
关系关联的对象ID列表时,这一点非常有效。例如,如果您有一个has\u many
表和一个foos
表,并且bar
有很多:bar到:foo\u bar,那么删除foos
对象上的所有关联的方法是传递foo
foo:{bar\u id:[“”]}
- 注意:当尝试与Rails的某些方面集成时,尤其是当发送一个由
这两种方法都比预期的更粗糙,我很高兴发现一种更干净的方法。2018,很抱歉回答老问题,但这里有一个更好的答案:
var arr = [];
$.post('block_ajax.php', {
'action': 'set_layout',
'listid': 123,
'layout': arr.toString() // It'll be empty string "" if array is empty, otherwise if array has value(s) it will be a string of comma-separated values
}, function(data) {
// ...
});
示例:
var layout = [].toString();// layout will be '' (empty string)
var layout = [1,2,3].toString();// layout will be string with comma-separated values '1,2,3'
在后端,无论是空字符串还是逗号分隔的字符串,它都将被发布,只需将其转换为数组即可
后端(PHP示例):
我用下面的方法解决了这个问题,我觉得这是最容易阅读的。假设有一个数组
myArray
,可以填充或为空:
'requestParam': myArray.length === 0 ? '' : myArray
即使为空,jQuery也不会忽略
requestParam
参数。我发现了一个简单的作弊方法
$.post('block_ajax.php'
, { 'action': 'set_layout'
, 'listid': 123
, 'layout': [{}]
}
, function(data) {
// ...
}
);
注意,我将空数组定义为[{}]
。jqueryajax命令只发送一个空数组,而不发送空对象
注意:
[[]]
不起作用。为什么要发送空参数?如果您想设置标志、令牌或其他东西,只需执行layout:true
。尝试“[]”
。应该这样做这叫做-,这可以防止您在尝试(例如)遍历数组之前检查数组是否存在。代码维护一个包含字段的容器树结构。客户端脚本需要与后端进行通信,无论容器是否已被清空(空白数组)或完全从树中删除(没有条目)。通常我只更新更改的字段。如果我没有得到任何参数,字段将不会得到更新,项目列表也不会得到更新-但是当我设置items=array()
正确时,应该删除所有项目?甚至items=null
,但是没有任何(post/get)信息模型都不知道它是否应该触摸items
字段!彼得:你找到解决办法了吗?我正经历着你所说的。如果发送空数组,我希望删除所有项目;如果数组中有项目,我希望添加不存在的项目,并删除不应该存在的项目。最后,nothing或null应该跳过检查。空白参数经常被使用,例如,我们在一个页面上有一个收藏夹列表,该列表使用与整个EntitiesList相同的端点,此外,它还发送一个ID的“过滤器”,该ID在我们的Solr中用作searchparam。不发送列表,等于不发送筛选器,等于检索所有实体,但空列表将呈现包含0个实体的结果。无列表和空列表之间存在巨大差异,因此有时会发送空参数。这不是答案——现在发送的非空数组带有假值,这将导致更多后端编码来解释这种情况。如果我们不能真正发送一个空数组,那么在后面对parm的存在进行一个简单的测试,其他人可能已经建议过了,这对于处理整个问题来说是非常干净的。这将适用于简单的情况,但是仍然令人烦恼。我知道这是一个非常非常古老的答案,但我需要否决这一点,因为它根本不能回答问题。您只是在“修复”错误的结果,而不是错误本身。用户不需要空数组如果他没有空数组,则用户希望发送空数组。a:一个空的列表和B:什么都没有。OP想要避免做的事情。答案很好,但实际上rails并没有将[''']
视为一个空数组:
$.post('block_ajax.php'
, { 'action': 'set_layout'
, 'listid': 123
, 'layout': [{}]
}
, function(data) {
// ...
}
);