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的某些方面集成时,尤其是当发送一个由
      has\u many
      关系关联的对象ID列表时,这一点非常有效。例如,如果您有一个
      foos
      表和一个
      bar
      表,并且
      foos
      有很多:bar到:foo\u bar,那么删除
      foo
      对象上的所有关联的方法是传递
      foo:{bar\u id:[“”]}

这两种方法都比预期的更粗糙,我很高兴发现一种更干净的方法。

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) {
            // ...
        }
);